/*多重背包入门题。
把问题转化成0-1也能A 。ORZ
这个是多重背包代码
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
int price[101],w[101],cnt[101];
int dp[101];
int main()
{
freopen("test.txt","r",stdin);
int C;
scanf("%d",&C);
while(C--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&price[i],&w[i],&cnt[i]);
}
memset(dp,-1,sizeof(dp));
dp[0]=0;
for(int i=1;i<=m;i++)
{
if(price[i]*cnt[i]>=n)
for(int j=price[i];j<=n;j++)
{
if(dp[j-price[i]]!=-1&&dp[j]<dp[j-price[i]]+w[i])
dp[j]=dp[j-price[i]]+w[i];
}
else
{
int k;
for(k=1;k*2<=cnt[i];k*=2)
{
for(int j=n;j>=k*price[i];j--)
{
if(dp[j-k*price[i]]!=-1&&dp[j]<dp[j-k*price[i]]+k*w[i])
dp[j]=dp[j-k*price[i]]+k*w[i];
}
}
k=cnt[i]-(k-1);//注意了。。
if(k>0)
for(int j=n;j>=k*price[i];j--)
{
if(dp[j-k*price[i]]!=-1&&dp[j]<dp[j-k*price[i]]+k*w[i])
dp[j]=dp[j-k*price[i]]+k*w[i];
}
}
}
printf("%d\n",dp[n]);
}
}
hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (多重背包)
最新推荐文章于 2019-08-14 17:47:43 发布