d862: NOIP2001 4.装箱问题
Tags: subset-sum
出處:https://zerojudge.tw/ShowProblem?problemid=d862
提交:https://zerojudge.tw/Submissions?problemid=d862&account=allllllan123456
問題:給你 $n\in[1,30]$ 個物品各自的體積,請問應該選入哪些物品到容量 $V\in[0,20000]$ 的箱子中才能使得剩餘空間最小?
解法:此乃 0/1 背包問題的應用,只要讓每個物品的價值就剛好等於它們各自的體積,就能套用它的模型了。
心得:這題物品數量少,可能有人會想使用 DFS,這題也會 AC,但是效率仍然不及 knapsack DP,像我就花了 31 ms。
1#include <bits/stdc++.h>
2using namespace std;
3
4int main() { ios_base::sync_with_stdio(false); cin.tie(0); // IO 優化
5 int dp[20001] = {0};
6 int V, n; cin >> V >> n;
7 for (int v; cin >> v;)
8 for (int i=V; i>=v; i--)
9 if (dp[i-v] + v > dp[i])
10 dp[i] = dp[i-v] + v;
11 cout << V - dp[V] << '\n';
12 return 0;
13}