0/1背包算法
0/1背包是我在做P2392时遇到的。
概念是给你一堆物品,每个物品有容量,让你最大化利用一个背包空间。
这道题的背包代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| int solve(int n, int* time_arr) { int sum = 0; for(int i = 0; i < n; i++) { sum += time_arr[i]; } int half = sum / 2; memset(dp, 0, sizeof(dp)); for(int i = 0; i < n; i++) { for(int j = half; j >= time_arr[i]; j--) { dp[j] = max(dp[j], dp[j - time_arr[i]] + time_arr[i]); } } return sum - dp[half]; }
|
其中time_arr是时间序列。
注意一定要逆向循环,如果正向循环则是无限背包。
记住状态转移方程:
1
| dp[j] = max(dp[j], dp[j - t] + t);
|