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要从大到小枚举的主要内容,如果未能解决你的问题,请参考以下文章
PAT (Advanced Level) Practice 1068 Find More Coins