完全背包问题(经典01背包升级版)

完全背包问题

有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。

第 i 种物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 种物品的体积和价值。

输出格式
输出一个整数,表示最大价值。

数据范围
0<N,V≤1000
0<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
10

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
    
    
    int n,v,a[1010],b[1010],i,j,k,s,d[1010];
    scanf("%d%d",&n,&v);
    for(i=1;i<=n;i++)
    scanf("%d%d",&a[i],&b[i]);
	for(i=0;i<=v;i++)
	d[i]=0;
	for(i=1;i<=n;i++)
	for(j=a[i];j<=v;j++)
	{
    
    
		d[j]=max(d[j],d[j-a[i]]+b[i]);
	}
	printf("%d\n",d[v]);
}

**

完全背包跟01背包没啥差别就是完全背包可以无限选择,而01背包只能选择一次,所以我们只需要让循环j从a[i]开始,这时候就会无限选择这个物品.

**

在这里插入图片描述
当i=1时,j=a[i]=1,这时候背包容量从1-5开始逐渐增加,当j=1时背包可以装下一个第一个物品,以此类推当j=5时,可以装下五个。
当i=2时,j=a[i]=2,这时候我们发现第二个物品跟第一个物品的价值一样,其实可以看出来,第一个物品和第二个物品平均价值是一样的.
不再一一推了…自己理解

猜你喜欢

转载自blog.csdn.net/m0_46381590/article/details/111479669
今日推荐