HDU–2191(多重背包)
悼念512汶川大地震遇难同胞-珍惜现在,感恩生活
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191
感觉这个挺难,分享一篇一个不错的关于多重背包转化01背包讲解的文章:http://blog.csdn.net/lyhvoyage/article/details/8545852
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
int w[21000],v[2100],f[110];
memset(w,0,sizeof(w));
memset(v,0,sizeof(v));
memset(f,0,sizeof(f));
int ans=0;
for(int i=0;i<m;i++)
{
int p,h,c;
scanf("%d%d%d",&p,&h,&c);
for(int j=1;j<=c;j<<=1)
{
w[ans]=j*h;
v[ans++]=j*p;
c=c-j;
}
if(c>0)
{
v[ans]=c*p;
w[ans++]=c*h;
}
}
for(int i=0;i<ans;i++)
{
for(int j=n;j>=v[i];j--)
{
if(f[j]<f[j-v[i]]+w[i])
{
f[j]=f[j-v[i]]+w[i];
}
}
}
printf("%d\n",f[n]);
}
return 0;
}
努力学习中 ing。。。。。