nowcoder 失衡天平

失衡天平

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

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

说明

可以称两次,第1次:(1 ; 5),第二次(61 ; 65)。

示例2

输入

复制

5 0
10 20 30 40 100

输出

复制

200

说明

称一次,(10,20,30,40 ; 100)。

题解:dp[i][j]前i个物品,天平两端相差为j时得到的重量。

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define Inf 1e9
const int N=10005;
int dp[110][N];
int main(){
    ios::sync_with_stdio(0);
    int n,m;
    cin>>n>>m;
    vector<int>a(n+1);
    for(int i=0;i<N;++i) dp[0][i]=-Inf;
    dp[0][0]=0;
    for(int i=1;i<=n;++i){
        cin>>a[i];
        for(int j=0;j<N;++j){
            dp[i][j]=dp[i-1][j];
        }
        for(int j=N-1;j>=0;--j){
            if(dp[i][j]==-Inf) continue;
            if(j+a[i]<N){
                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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值