当前位置: 代码迷 >> 综合 >> HDU--2191(多重背包)
  详细解决方案

HDU--2191(多重背包)

热度:41   发布时间:2023-11-17 11:15:18.0

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。。。。。