1268:【例9.12】完全背包问题

挑战一下完全背包问题

原题

1268:【例9.12】完全背包问题

【题目描述】 设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。

【输入】
第一行:两个整数,M(背包容量,M≤200)和N(物品数量,N≤30);
第2…N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。
【输出】
仅一行,一个数,表示最大总价值。
【输入样例】
10 4
2 1
3 3
4 5
7 9
【输出样例】
max=12

完全背包可以选取多次同一物品,0-1背包只能选取一次,这是它们的最大区别

思路:

由题意可知,背包容量为M,物品数量为N。在程序中M可以设为v,N则还是n(变不变可以按照自己的习惯,不一定要和这里一样)
这道题是求最大价值,所以最后输出的应为d【v】。

代码:

#include<iostream>
#include<cstdio>
using namespace std;
int d[210],v,n,c[40],w[40];
int main()
{
	cin>>v>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>w[i]>>c[i];
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=w[i];j<=v;j++)
		{
			d[j]=max(d[j],d[j-w[i]]+c[i]); 
		}
	}
	cout<<"max="<<d[v];
	return 0;
}

以上是一维数组的写法

解释:

v,n的取值范围为0-200和0-30,保险起见我们再加多10个元素给它
所以int d[210],v,n,c[40],w[40];
d数组表示的是最大价值,w数组表示重量/质量,c数组表示的是该物品的价值

在第二个双重循环中,j必须从0或w【i】到v;否则就会变成0-1背包了
max函数是比较d【j】与d[j-w[i]]+c[i]之间的最大价值

最后不要忘记了“max=”

写完之后就可以拿去这里提交了(前提是有账号)
提交链接

然后就可以收获快乐了()

(一会有时间出个0-1背包问题的,超简单)
新手写文,希望喜欢

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值