失衡天平(动态规划,dp)

题目描述

终于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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值