背包问题的简化版本.
类似的还有
P2639 [USACO09OCT]Bessie's Weight Problem G
P2925 [USACO08DEC]Hay For Sale S
所谓剩余空间最小,即在有限的空间里放最多的物品.
如果把物体的体积看作w[i],且物体的体积也看作v[i],你会发现这是01背包问题,只不过w[i]和v[i]相等,W即箱子的体积.
#include <algorithm> #include <cstdio> #include <cstring> #include <iostream> using namespace std; int W, n, s[510]; int dp[45010]; int main() { cin >> W >> n; for (int i = 0; i < n; i++) cin >> s[i]; for (int i = 0; i < n; i++) for (int j = W; j >= s[i]; j--) dp[j] = max(dp[j], dp[j - s[i]] + s[i]); cout << W - dp[W] << endl; return 0; }
(以上代码不保证AC)
先前的AC代码:
#include <algorithm> #include <cstdio> #include <iostream> #include <cstdlib> #include <cstring> using namespace std; int n, V, dp[50][20000]; int s[50]; int rec(int i, int v) { if(dp[i][v] >= 0) return dp[i][v]; int res; if(i == n) res = v; else if(s[i] > v) res = rec(i + 1, v); else res = min(rec(i + 1, v - s[i]), rec(i + 1, v)); return dp[i][v] = res; } int main() { cin >> V >> n; memset(dp, -1, sizeof(dp)); for(int i = 0; i < n; i++) cin >> s[i]; printf("%d ", rec(0, V)); return 0; }