题解 | #失衡天平#

失衡天平

https://ac.nowcoder.com/acm/contest/24213/1021

失衡天平

题目描述

终于Alice走出了大魔王的陷阱,可是现在傻傻的她忘了带武器了,这可如何是好???这个时候,一个神秘老人走到她面前答应无偿给她武器,但老人有个条件,需要将所选武器分别放在天平的两端,若天平平衡则可以将天平上的所有武器拿走,还好这个天平锈迹斑斑,只要两端重量相差小于等于m就会保持平衡,Alice傻傻的认为越重的武器越好,求Alice最多能拿走的武器总重量。(不限操作次数)

输入描述

第一行2个整数 n, m; 第二行n个整数x,分别表示n件武器的重量。 1 <= n <= 100; 0 <= m <= 100; 1 <= x <= 100;

输出描述

一个整数,表示Alice最多能拿走的武器总重量。

解析

状态表示

f[i][j]代表将前i个武器分成两组,两边的差的绝对值为j的最大重量和。

状态计算

对于a[i],Alice有三种操作:

①不取a[i]

②取a[i],放在天平左边

③取a[i],放在天平右边

所以,状态转移方程为:f[i][j] = max{f[i - 1][abs(j- a[i])] + a[i],f[i - 1][j + a[i]] + a[i],f[i - 1][j])

代码

#include <bits/stdc++.h>

using namespace std;
const int N = 1e4 + 100;
int n,m,a[110],ans = 0,f[110][N];

int main()
{
    cin >> n >> m;
    for(int i = 1;i <= n;i ++) cin >> a[i];
    //f[i][j]代表 前i个分成两组,两边的差的绝对值为j的最大重量和。
    memset(f,-0x3f,sizeof f);
    f[0][0] = 0;
    for(int i = 1;i <= n;i ++){
        for(int j = 0;j <= N;j ++){
            f[i][j] = f[i - 1][j];//不取a[i]
            f[i][j] = max(f[i][j],f[i - 1][abs(j - a[i])] + a[i]);//取a[i],放左边
            f[i][j] = max(f[i][j],f[i - 1][abs(j + a[i])] + a[i]);//取a[i],放右边
        }
    }
    for(int i = 0;i <= m;i ++) ans = max(ans,f[n][i]);
    cout << ans << '\n';
    return 0;
}
全部评论

相关推荐

10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务