题目描述
终于Alice走出了大魔王的陷阱,可是现在傻傻的她忘了带武器了,这可如何是好???这个时候,一个神秘老人走到她面前答应无偿给她武器,但老人有个条件,需要将所选武器分别放在天平的两端,若天平平衡则可以将天平上的所有武器拿走,还好这个天平锈迹斑斑,只要两端重量相差小于等于m就会保持平衡,Alice傻傻的认为越重的武器越好,求Alice最多能拿走的武器总重量。(不限操作次数)
输入描述:
第一行2个整数 n, m; 第二行n个整数x,分别表示n件武器的重量。 1 <= n <= 100; 0 <= m <= 100; 1 <= x <= 100;
输出描述:
一个整数,表示Alice最多能拿走的武器总重量。
示例1
输入
5 4 1 5 61 65 100
输出
132
示例2
输入
5 0 10 20 30 40 100
输出
200
分析:
dp[i][j] ,在第 i 个物品天平两边相差为 j 的最大重量
不选时dp[i][j] = max(dp[i][j], dp[i - 1][j]);
同侧:dp[i][j + a[i]] = max(dp[i][j + a[i]], dp[i - 1][j] + a[i]);
异侧:dp[i][j - a[i]] = max(dp[i][j - a[i]], dp[i - 1][j] + a[i]);
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <vector>
using namespace std;
typedef long long ll;
int n, m;
int a[110];
int dp[110][10010];
int sum = 0;
const int inf = 0x3f3f3f3f;
int main()
{
cin >> n >> m;
memset(dp, -inf, sizeof(dp));
dp[0][0] = 0;
for (int i = 1; i <= n; i++) cin >> a[i], sum += a[i];
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= sum; j++) {
dp[i][j] = max(dp[i][j], dp[i - 1][j]);
dp[i][j + a[i]] = max(dp[i][j + a[i]], dp[i - 1][j] + a[i]);
dp[i][abs(j - a[i])] = max(dp[i][abs(j - a[i])], dp[i - 1][j] + a[i]);
}
}
int ans = 0;
for (int i = 0; i <= m; i++) ans = max(ans, dp[n][i]);
cout << ans;
return 0;
}