HDU 3033 I love sneakers! (分组背包)


n-物品总数 ,m 钱数, k 牌子数  ,描述 a 牌号  b标价  c价值  

每组必须买一个,每个物品只有一个

每种牌子都要买到,否则impossible

step1   :先把鞋分组 , 用vector存起来
step2:然后对于每一组 单独 讨论 
****对于每一组:****
至少必须买一个物品,  并且每个物品只能用1次
【注意】 每个物品只能用1次  <=>
     钱(体积)从大到小更新这样保证每个物品只用一次
【注意二】 ,初值符-oo(无穷小)  ,这样保证物品的钱(体积)为0的情况不出bug 
同时也保证了至少买一个物品了,因为无穷小量  会更新的嘛 。

d[i][k] 表示买了(截止到)1 至 i 种款式的鞋子,

          使用的钱是 k 产生的最大的价值是 d[i][k];



struct Node{
       int v ;
       int money ;
};
int V  , K ;
vector<Node> Brand[11] ;
int dp[11][10008] ;

int Max(int a , int b , int c){
    if(a < b)
        a = b ;
    if(a < c)
        a = c ;
    return a ;
}

int DP(){
    int i , j , k ;
    for(i = 1 ; i <= K ; i++){
        if(Brand[i].size() == 0)
            return inf ;
    }
    for(i = 1 ; i <= K ; i++)
        for(j = 0 ; j <= V ; j++)
           dp[i][j] = -0x7fffffff ;
    for(i = 0 ; i <= V ; i++)
        dp[0][i] = 0 ;
    for(i = 1 ; i <= K ; i++){
       for(j = 0 ; j < Brand[i].size() ; j++){
          int v = Brand[i][j].v ;
          int money = Brand[i][j].money ;
          for(k = V ; k >= v ; k--){
               dp[i][k] = Max(dp[i][k] , dp[i][k-v] + money , dp[i-1][k-v] + money) ;
          }
       }
    }
    return dp[K][V] ;
}

int main(){
    int n , i , k ;
    Node node ;
    while(cin>>n>>V>>K){
        for(i = 1 ; i <= K ; i++)
            Brand[i].clear() ;
        for(i = 1 ; i <= n ; i++){
            cin>>k>>node.v>>node.money ;
            Brand[k].push_back(node) ;
        }
        if(DP() == inf)
            puts("Impossible") ;
        else
            cout<<dp[K][V]<<endl ;
    }
    return 0 ;
}


你可能感兴趣的:(HDU 3033 I love sneakers! (分组背包))