01背包

普通版本

/**\
f[i][j] 表示 前i件物品容量为j时最大价值
\**/
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m, v[N], w[N], f[N][N];
signed main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; ++i) cin >> v[i] >> w[i];
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 0; j <= m; ++j)
        {
            if(j < v[i]) f[i][j] = f[i - 1][j];
            else
            {
                f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
            }
        }
    }
    cout << f[n][m];
    return 0;
}

优化版本

 1 /**\
 2 滚动数组优化
 3 \**/
 4 #include <bits/stdc++.h>
 5 using namespace std;
 6 const int N = 1010;
 7 int n, m, v[N], w[N], f[N];
 8 signed main()
 9 {
10     cin >> n >> m;
11     for(int i = 1; i <= n; ++i) cin >> v[i] >> w[i];
12     for(int i = 1; i <= n; ++i)
13     {
14         for(int j = m; j >= v[i]; --j)
15         {
16             f[j] = max(f[j], f[j - v[i]] + w[i]);
17         }
18     }
19     cout << f[m];
20     return 0;
21 }
 1 /**\
 2 如果题目要求刚好装满
 3 \**/
 4 #include <bits/stdc++.h>
 5 using namespace std;
 6 const int inf = 0x3f3f3f3f;
 7 const int mx = 1e4 + 9;
 8 int n, m;
 9 int f[mx], w[mx], v[mx];
10 void solve() {
11     cin >> m >> n;
12     for(int i = 0; i < mx; i++) f[i] = -inf;
13     f[0] = 0;
14     for(int i = 1; i <= n; i++) {
15         cin >> v[i] >> w[i];
16     }
17     for (int i = 1; i <= n; i++) {
18         for (int j = m; j >= v[i]; j--) {
19             f[j] = max(f[j], f[j - v[i]] + w[i]);
20             if (f[j] < 0)
21                 f[j] = -inf;
22         }
23     }
24     if(f[m] > 0) cout << f[m];
25     else       cout << "no";
26 }
27 int main() {
28     solve();
29     return 0;
30 }

 

posted @ 2022-03-09 10:29  std&ice  阅读(54)  评论(0编辑  收藏  举报