http://acm.hdu.edu.cn/showproblem.php?pid=2191
这是做的多重背包类型的第二题,感觉自己运用的还不是太熟悉,继续加油。。。
#include<iostream>
#include<string.h>
using namespace std;
int v,j;
int a[105],b[105],c[105],dp[105];
void zeroonePack(int x,int y)
{
for(j=v;j>=x;j--)
dp[j]=max(dp[j-x]+y,dp[j]);
}
void completePack(int x,int y)
{
for(j=x;j<=v;j++)
dp[j]=max(dp[j-x]+y,dp[j]);
}
void multipiePack(int x,int y,int z)
{
int k=1;
if(x*z>v)
completePack(x,y);
else
{
while(k<z)
{
zeroonePack(x*k,y*k);
z-=k;
k*=2;
}
zeroonePack(x*z,y*z);
}
}
int main()
{
int n,m,i;
scanf("%d",&n);
while(n--)
{
memset(dp,0,sizeof(dp));
scanf("%d%d",&v,&m);
for(i=1;i<=m;i++)
scanf("%d%d%d",&a[i],&b[i],&c[i]);
for(i=1;i<=m;i++)
multipiePack(a[i],b[i],c[i]);
printf("%d\n",dp[v]);
}
return 0;
}