关于01背包一维数组的学习
936
2022.04.04
2022.04.04
发布于 未知归属地

动态规划有一个很重要的特性,就是未来的状态不能影响过去的状态

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];


}
评论 (0)