列表

详情


NC19158. 失衡天平

描述

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Pascal(fpc 3.0.2) 解法, 执行用时: 11ms, 内存消耗: 484K, 提交时间: 2018-10-25 14:45:37

uses math;
var n,m,i,j,mm:longint;
a,f,f1:array[-20000..20000] of longint;
begin
readln(n,m);
for i:=1 to n do read(a[i]);
f[a[1]]:=a[1];f[-a[1]]:=a[1];
for i:=2 to n do
  begin
  f1:=f;
  for j:=-10000 to 10000 do
    if f1[j]>0 then
      begin
      f[j-a[i]]:=max(f[j-a[i]],f1[j]+a[i]);
      f[j+a[i]]:=max(f[j+a[i]],f1[j]+a[i]);
      end;
  end;
for i:=-m to m do
  if f[i]>mm then
    mm:=f[i];
writeln(mm);
close(input);close(output);
end.

C++(g++ 7.5.0) 解法, 执行用时: 9ms, 内存消耗: 4536K, 提交时间: 2023-05-15 14:16:27

#include<bits/stdc++.h>
using namespace std;
int n,m,a[105],dp[105][10005],ans;
int main(){
    cin>>n>>m;
    memset(dp,-0x3f,sizeof(dp));
    for(int i=1;i<=n;i++) cin>>a[i];
    dp[0][0]=0;
    for(int i=1;i<=n;i++) for(int j=0;j<=10005;j++) dp[i][j]=max({dp[i-1][j],dp[i-1][abs(j-a[i])]+a[i],dp[i-1][j+a[i]]+a[i]});
    for(int i=0;i<=m;i++) ans=max(ans,dp[n][i]);
    cout<<ans;
}

C++11(clang++ 3.9) 解法, 执行用时: 6ms, 内存消耗: 4496K, 提交时间: 2020-07-08 13:47:08

#include<bits/stdc++.h>
using namespace std;

int i,j,n,m,x,DP[105][10005];
int main()
{
    scanf("%d%d",&n,&m);
	memset(DP,-0x3f,sizeof(DP)),DP[0][0]=0;
    for(i=1;i<=n;i++)
    {
    	scanf("%d",&x);
    	for(j=0;j<=1e4;j++)DP[i][j]=max(DP[i-1][j],max(DP[i-1][j+x]+x,DP[i-1][abs(j-x)]+x));
	}
	for(i=j=0;i<=m;i++)j=max(j,DP[n][i]);
	printf("%d\n",j);
    return 0;
}

上一题