完全背包问题两种解法

有 $N$ 种物品和一个容量是 $V$ 的背包,每种物品都有无限件可用。 第 $i$ 种物品的体积是 $v_i$,价值是 $w_i$。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整数,$N,V$,用空格隔开,分别表示物品种数和背包容积。 接下来有 $N$ 行,每行两个整数 $v_i, w_i$,用空格隔开,分别表示第 $i$ 种物品的体积和价值。 输出格式 输出一个整数,表示最大价值。 数据范围 $0 \lt N, V \le 1000$ $0 \lt v_i, w_i \le 1000$ 输入样例 4 5 1 2 2 4 3 4 4 5

输出样例: 10

解题代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <bits/stdc++.h>
using namespace std;
const int MAX = 3000;
int dp[MAX];
int n,m;
int v[MAX],w[MAX];
int main()
{
    
    cin>>n>>m;
    for (int i=0;i<n;i++) {
        
        //体积,重量
        cin>> v[i] >>w[i];
        // for (int j=v;j<=m;j++) {
        //     dp[j] = max(dp[j],dp[j-v] + w);
        // }
    }
    for(int i=0;i<=m;i++) {
        for(int j=0;j<n;j++) {
            if(i>=v[j]) dp[i] = max(dp[i],dp[i-v[j]] + w[j]);
        }
    }
    cout << dp[m] <<endl;
    
    return 0;
}

解法2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <bits/stdc++.h>
using namespace std;
const int MAX = 3000;
int dp[MAX];
int n,m;
int v[MAX],w[MAX];
int main()
{
    
    cin>>n>>m;
    for (int i=0;i<n;i++) {
        
        //体积,重量
        cin>> v[i] >>w[i];
        
    }
    
    for(int i=0;i<n;i++) {
        for(int j=v[i];j<=m;j++) {
            dp[j] = max(dp[j],dp[j-v[i]] + w[i]);
        }
    }
    cout << dp[m] <<endl;
    
    return 0;
}