Description
终于Alice走出了大魔王的陷阱,可是现在傻傻的她忘了带武器了,这可如何是好???这个时候,一个神秘老人走到她面前答应无偿给她武器,但老人有个条件,需要将所选武器分别放在天平的两端,若天平平衡则可以将天平上的所有武器拿走,还好这个天平锈迹斑斑,只要两端重量相差小于等于m就会保持平衡,Alice傻傻的认为越重的武器越好,求Alice最多能拿走的武器总重量。(不限操作次数)
Solution
分析了一下问题,情况很多,显然贪心做不了,考虑做 , 令 为前 个物品取得天平两端相差 的最优策略, 那么有 . 加 是因为当 出现负数时,此时重量大的天平和重量小的天平一侧角色互换.
那么最终答案就是
Code
#include<bits/stdc++.h> using namespace std; const long long inf = 1e18; const int N = 105 * 100 + 5; int dp[105][2 * N], a[105]; int main() { int n, m; cin >> n >> m; for(int i = 1; i <= n; i++) { cin >> a[i]; } memset(dp, -0x3f, sizeof(dp)); dp[0][0] = 0; for(int i = 1; i <= n; i++) { for(int j = 0; j <= N; j++) { dp[i][j] = dp[i - 1][j]; dp[i][j] = max(dp[i][j], dp[i - 1][abs(j - a[i])] + a[i]); dp[i][j] = max(dp[i][j], dp[i - 1][j + a[i]] + a[i]); } } int ans = -1; for(int i = 0; i <= m; i++) ans = max(ans, dp[n][i]); cout << ans << "\n"; return 0; }