NC19158. 失衡天平
描述
输入描述
第一行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; }