#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N];
int f[N];
int g[N];
int main()
{
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf("%d %d", &v[i], &w[i]);
}
// for (int i = n; i >= 1; i--)
// {
// for (int j = 0; j <= m; j++)
// {
// if (j < v[i])
// {
// g[j] = f[j];
// }
// else if (j >= v[i])
// {
// g[j] = max(f[j], f[j - v[i]] + w[i]);
// }
// }
// memcpy(f, g, sizeof g);
// }
// cout<<f[m]<<endl;
// for (int i = 1; i <= n; i++)
// {
// for (int j = 0; j <= m; j++)
// {
// if (j < v[i])
// {
// g[j] = f[j];
// }
// else if (j >= v[i])
// {
// g[j] = max(f[j], f[j - v[i]] + w[i]);
// }
// }
// memcpy(f, g, sizeof g);
// }
// cout << f[m] << endl;
// for (int i = 1; i <= n; i++)
// {
// for (int j = m; j >= 0; j--)
// {
// if (j >= v[i])
// {
// f[j] = max(f[j], f[j - v[i]] + w[i]);
// }
// }
// }
// cout << f[m] << endl;
for (int i = n; i >= 1; i--)
{
for (int j = m; j >= 0; j--)
{
if (j >= v[i])
{
f[j] = max(f[j], f[j - v[i]] + w[i]);
}
}
}
cout << f[m] << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N];
int mem[N][N];
int f[N][N];
int g[N];
int dfs(int x, int spV)
{
if (mem[x][spV])
return mem[x][spV];
int sum = 0;
if (x > n)
sum = 0;
else if (spV < v[x])
sum = dfs(x + 1, spV);
else
sum = max(dfs(x + 1, spV), dfs(x, spV - v[x]) + w[x]);
mem[x][spV] = sum;
return sum;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> v[i] >> w[i];
// int res=dfs(1,m);
// cout << res << endl;
// for (int i = 1; i <= n; i++)
// for (int j = v[i]; 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][j - v[i]] + w[i]);
// }
// cout << f[n][m] << endl;
for (int i = 1; i <= n; i++)
for (int j = v[i]; j <= m; j++) // j不能从0开始,因为j-v[i]可能小于0,导致g[j-v[i]]越界
{
g[j] = max(g[j], g[j - v[i]] + w[i]);
}
cout << g[m] << endl;
return 0;
}
01背包求体积恰好为M的方案数:数字组合
完全背包求体积恰好为M的方案数:买书
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, V, M;
int v[N], m[N], w[N];
int mem[N][110][110];
int f[N][110][110];
int g[110][110];
int dfs(int x, int spV, int spM)
{
if (mem[x][spV][spM])
return mem[x][spV][spM];
int sum = 0;
if (x > n)
sum = 0;
else if (spV < v[x] || spM < m[x])
sum = dfs(x + 1, spV, spM);
else
sum = max(dfs(x + 1, spV, spM), dfs(x + 1, spV - v[x], spM - m[x]) + w[x]);
mem[x][spV][spM] = sum;
return sum;
}
int main()
{
cin >> n >> V >> M;
for (int i = 1; i <= n; i++)
cin >> v[i] >> m[i] >> w[i];
// int res=dfs(1,V,M);
// cout<<res<<endl;
// for (int i = n; i >= 1; i--)
// for (int j = 0; j <= V; j++)
// for (int k = 0; k <= M; k++)
// {
// if (j < v[i] || k < m[i])
// f[i][j][k] = f[i + 1][j][k];
// else
// f[i][j][k] = max(f[i + 1][j][k], f[i + 1][j - v[i]][k - m[i]] + w[i]);
// }
// cout << f[1][V][M] << endl;
// for (int i = 1; i <= n; i++)
// for (int j = V; j >= v[i]; j--)
// for (int k = M; k >= m[i]; k--)
// {
// g[j][k] = max(g[j][k], g[j - v[i]][k - m[i]] + w[i]);
// }
// cout << g[V][M] << endl;
for (int i = n; i >= 1; i--)
for (int j = V; j >= v[i]; j--)
for (int k = M; k >= m[i]; k--)
{
g[j][k] = max(g[j][k], g[j - v[i]][k - m[i]] + w[i]);
}
cout << g[V][M] << endl;
return 0;
}