hdu 2191 珍惜现在,感恩生活(多重背包)

题意:

有N元经费,M种大米,每种大米有单袋价格p元,单袋重量h,以及对应袋数c。

问最多可以买多重的大米。

 

思路:

经典多重背包,用二进制的方法。

看代码

 

代码:

struct node{
    int price,weight,num;
}
obj[105];

int dp[105];
int n,m;


void MultiplePack(int cost,int value,int amount){
    if(cost*amount>=n){
        rep(i,cost,n) dp[i]=max( dp[i],dp[i-cost]+value );
        return;
    }
    int k=1;
    while(k<amount){
        rep2(i,n,k*cost) dp[i]=max( dp[i],dp[i-k*cost]+k*value );
        amount -= k;
        k *= 2;
    }
    rep2(i,n,amount*cost) dp[i]=max( dp[i],dp[i-amount*cost]+amount*value );
}

int main(){

    int T;
    cin>>T;
    while(T--){
        cin>>n>>m;
        rep(i,1,m)
            cin>>obj[i].price>>obj[i].weight>>obj[i].num;

        mem(dp,0);

        rep(i,1,m){
            MultiplePack(obj[i].price,obj[i].weight,obj[i].num);
        }

        cout<<dp[n]<<endl;
    }

    return 0;
}

 

posted @ 2015-01-23 21:14  fish7  阅读(102)  评论(0编辑  收藏  举报