首页 > 其他 > 详细

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

时间:2015-01-23 22:52:44      阅读:394      评论:0      收藏:0      [点我收藏+]

题意:

有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;
}

 

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

原文:http://www.cnblogs.com/fish7/p/4245075.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!