概述
#include <bits/stdc++.h>
using namespace std;
struct E
{
int w;
//体积
int v;
//重量
} lis[2001];
int dp[101];
int main()
{
int T,n,m;
int p,h,k;
int i,j;
int index,c;
scanf("%d%d",&n,&m);
//n表示容量,m表示种类
index = 0;
//拆分后物品总数
for( i=1; i<=m; i++)
{
c = 1;
scanf("%d%d%d",&p,&h,&k);
//p表示价格,h表示重量,k表示大米袋数。
while( k-c>0)
{
k -= c;
lis[++index].w = c*p;
lis[index].v = c*h;
c *= 2;
}
lis[++index].w = p*k;
//补充不足指数的差值
lis[index].v = h*k;
}
for( i=0; i<=n; i++) dp[i]=0;
for( i=1; i<=index; i++)
//对拆分后的物品进行0-1背包
{
for( j=n; j>=lis[i].w; j--)
dp[j] = max( dp[j],dp[j-lis[i].w]+lis[i].v);
}
printf("%dn",dp[n]);
return 0;
}
单调队列优化多重背包
最后
以上就是幸福酸奶为你收集整理的多重背包问题的全部内容,希望文章能够帮你解决多重背包问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复