0-1背包使用一维dp数组时为何v要从大到小枚举

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0-1背包使用一维dp数组时为何v要从大到小枚举相关的知识,希望对你有一定的参考价值。

样例数据

5 8
3 5 1 2 2
4 5 2 1 3

如若不然,也就是让v按照从小到大的顺序枚举,就会出现

 注意高亮的那一行,第一件物品的重量只有3,怎么会得到6呢?

代码如下

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<utility>
#include<bits/stdc++.h>
using namespace std;

const int INF = 1e9;//10的9次方 
const double eps = 1e-3;
const int maxn = 10;


int main(){
	int num,V;//物品的件数和背包的容积
	
	int c[maxn],w[maxn],dp[maxn]; 
		
	scanf("%d %d",&num,&V);
	
	for(int i=0;i<num;i++){
		scanf("%d",&w[i]);
	}
	
	for(int i=0;i<num;i++){
		scanf("%d",&c[i]);
	}
	
	//边界
	for(int i=0;i<=V;i++){
		dp[i] = 0;
	}
	
	//开始状态转移
	for(int i=0;i<num;i++){
		for(int v=w[i];v<=V;v++){
			printf("前%d件物品恰好装入容量为%d的背包所能获得的最大价值\\n",i+1,v);
			dp[v] = max(dp[v],dp[v-w[i]]+c[i]);
			for(int j=0;j<=V;j++){
				printf("%d ",dp[j]);
			}
			printf("\\n");
		}
	} 
	
	
	return 0; 
}

而如果是背包问题(也就是每件物品的数量是无限的),则v应从小到大枚举。

以上是关于0-1背包使用一维dp数组时为何v要从大到小枚举的主要内容,如果未能解决你的问题,请参考以下文章

matlab如何将一个一维数组从大到小排序

01背包

PAT (Advanced Level) Practice 1068 Find More Coins

用java编写一个程序,将10个整数放到一维数组中,并按从大到小排序后输出

01背包_顺序枚举和逆序枚举的问题_一维数组

如何检查二维数组是不是从大到小排序