挑战一下完全背包问题
原题
【题目描述】 设有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背包问题的,超简单)
新手写文,希望喜欢