二维 :
#include <iostream>
using namespace std;
const int N = 35, M = 2e5 + 10;
int f[N][M]; // f[i][j] : 从前i个物品中选,箱子体积为j的情况下能装的最大体积
int w[N];
int main()
{
int V, n;
cin >> V >> n;
for (int i = 1 ; i <= n ; i ++) cin >> w[i];
for (int i = 1 ; i <= n ; i ++) // 所有物品(选或不选)
for (int j = 0 ; j <= V ; j ++)
{
f[i][j] = f[i-1][j];
if (j >= w[i]) f[i][j] = max(f[i][j], f[i - 1][j - w[i]] + w[i]); // 选
}
cout << V - f[n][V] << endl;
return 0;
}
优化成一维 :
#include <iostream>
using namespace std;
const int M = 20010;
int f[M];
int n, V;
int main()
{
cin >> V >> n;
for(int i = 1 ; i <= n ; i ++)
{
int v;
cin >> v;
for(int j = V ; j >= v ; j --) f[j] = max(f[j], f[j - v] + v);
}
cout << V - f[V] << endl;
return 0;
}