动态规划有一个很重要的特性,就是未来的状态不能影响过去的状态
01背包的循环时一个嵌套循环,外层循环的时物品的重量,内层循环的是背包的容量
这两层循环都会影响动态规划的状态,也就说背包总价值受商品个数和背包容量的影响
商品个数的增加 是不会影响过去的状态的,意思就是说,2件商品时能够取得的最大价值,并不影响一件商品能够取得的最大价值
但是背包容量的增加时会影响过去的状态的 在一维数组的情况下
一维数组的长度是背包的容量
存的值是商品的总价值
我们在推到二维数组的时候得到了一个结论,第i件物品能够在背包容量为j的情况下 实现商品最大的总价值 是依赖第i-1 件物品在不同背包容量的情况下能够 实现商品最大的总价值
在一维数组的情况下,第i件物品在不同容量下实现的最大价值 实际上是继承的第i-1 件物品的情况
正向循环会从头改变数组的值,实际上是改变了i-1件物品时候的值,相当于影响了过去,数组后半部分失去了依赖的基值,所以01背包的内存循环时逆向的。
测试数据
输入
第一行背包的容量和商品个数
下面的是商品的重量和价值
10 3
4 5
3 10
6 1
输出
15#include <bits/stdc++.h>
using namespace std;
int i,j,c,n,wi,vi,dp[10001];
int main(){
cin>>c>>n;
for(i=1;i<=n;i++){
cin>>wi>>vi;
for(j=c;j>=wi;j--){
dp[j] = max(dp[j],dp[j-wi]+vi);
}
}
cout<<dp[c];
}