如题:http://acm.hdu.edu.cn/showproblem.php?pid=2191
为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买。
请问:你用有限的资金最多能采购多少公斤粮食呢?
后记:
人生是一个充满了变数的生命过程,天灾、人祸、病痛是我们生命历程中不可预知的威胁。
月有阴晴圆缺,人有旦夕祸福,未来对于我们而言是一个未知数。那么,我们要做的就应该是珍惜现在,感恩生活——
感谢父母,他们给予我们生命,抚养我们成人;
感谢老师,他们授给我们知识,教我们做人
感谢朋友,他们让我们感受到世界的温暖;
感谢对手,他们令我们不断进取、努力。
同样,我们也要感谢痛苦与艰辛带给我们的财富~
1 8 2 2 100 4 4 100 2
400
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define max(a,b)(a>b?a:b)
int n,m;
int w[105];
int c[105];
int num[105];
int f[40005];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(f,0,sizeof(f));
int i,j,k;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
scanf("%d%d%d",&c[i],&w[i],&num[i]);
for(i=1;i<=m;i++)
{
for(k=1;k*2-1<=num[i];k*=2)
for(j=n;j>=k*c[i];j--)
f[j]=max(f[j],f[j-k*c[i]]+k*w[i]);
for(j=n;j>=(num[i]-k+1)*c[i];j--)
f[j]=max(f[j],f[j-(num[i]-k+1)*c[i]]+w[i]*(num[i]-k+1));
}
printf("%d\n",f[n]);
}
return 0;
}
本文介绍了一个经典的计算机科学问题——多重背包问题,通过一个具体的例子详细解释了如何使用二进制拆分的方法来解决该问题。文章提供了一段C++代码实现,展示了如何计算在有限预算内购买最大重量的大米。
407

被折叠的 条评论
为什么被折叠?



