51nod 1086 背包问题 V2

来源:互联网 发布:二维数组去除重复 编辑:程序博客网 时间:2024/05/18 03:11
#include <bits/stdc++.h>using namespace std;long long dp[2][50050],cost[110],val[110],num[110],c[770],v[770];int main(){long long n,w,i,j,x,cnt;while(cin>>n>>w){for(i=1;i<=n;i++)scanf("%lld%lld%lld",&cost[i],&val[i],&num[i]);cnt=1;for(i=1;i<=n;i++){x=1;while(x<=num[i]){c[cnt]=cost[i]*x;v[cnt]=val[i]*x;cnt++;num[i]-=x;x<<=1;}if(num[i]){c[cnt]=cost[i]*num[i];v[cnt]=val[i]*num[i];cnt++;}}memset(dp,0,sizeof(dp));for(i=1;i<cnt;i++){for(j=1;j<=w;j++){if(j<c[i])dp[i&1][j]=dp[i&1^1][j];elsedp[i&1][j]=max(dp[i&1^1][j],dp[i&1^1][j-c[i]]+v[i]);}} printf("%lld\n",dp[cnt&1^1][w]);}}

0 0