经典01背包问题(一维数组优化法)

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
输出样例:
8

#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=v;j>=a[i];j--)
	{
    
    
		d[j]=max(d[j],d[j-a[i]]+b[i]);//不选当前物品和选当前物品的最大值
	}
	printf("%d\n",d[v]);
}

在这里插入图片描述
样例数据
当i=1时,j从最大开始j=5到j=1都可以装下第一个i,所有价值就是2
当i=2时,j=5开始,因为当想要第二个物品就要为他腾出空间,所以d[j]=max(d[j],d[j-a[i]]+b[i]);这个时候d[5]=d[5-a[2]]+b[2]=6,当j=2时我们发现选择第二种物品比第一种物品的价值更大,所以我们会选择第二种物品,j=1时,选择第一种。
当i=3时,j=5开始,这时候想要第三件物品就要为第三件物品腾出空间也是5-3=2,这个2就代表你只有2的空间去选择前两件物品,我们发现当空间为2时,价值最大为4,所以这时候d[5]=8,同理可求出4,3,2,1。
一直计算出所以i选或者不选的情况.
当我们想要这件物品就需要为这件物品腾出空间,也就是j-a[i]再加上它的价值b[i]与它不选择这件物品的d[j]比较选出最大值.

后面会更新二维数组做法,一维数组比较方便!!!,二维数组容易炸!!!所以会一维数组最好,但二维数组更容易理解.

猜你喜欢

转载自blog.csdn.net/m0_46381590/article/details/111479320