背包问题之0-1背包

2019-10-13  本文已影响0人  小菜变大菜

背包问题是典型的动态规划例子。我们可将子问题的解存储下来,以免计算其母问题时需用到子问题结果而重复计算。

问题阐述

给定背包容量W,n个物品及各个物品的价值和重量,问如何选择使背包能装下物品的价值最大?

定义数据结构

状态转移方程

对第i个物品的判断,有两种可能性:

考虑下面这个问题

代码实现

#include <iostream>
#include <cstdio>
#include <cstring>


using namespace std;
const int maxn = 105;
int v[maxn], w[maxn], dp[maxn];

int main()
{
    int n; cin >> n;
    int W; cin >> W;
    memset(v, 0, sizeof(v));
    memset(w, 0, sizeof(w));
    memset(dp, 0, sizeof(dp));
    for(int i=1; i<=n; i++)
        cin >> w[i] >> v[i];
    for(int i=1; i<=n; i++){
        int ww = W;
        for(; ww>=w[i]; ww--){ //注意是从大到小的顺序
            dp[ww] = max(dp[ww], dp[ww-w[i]]+v[i]);  //递推公式
        }
    }
    cout << dp[W];
    return 0;
}

Tips

上一篇下一篇

猜你喜欢

热点阅读