1021 失衡天平 动态规划 线性DP 思维
链接:https://ac.nowcoder.com/acm/contest/24213/1021
来源:牛客网
题目描述
输入描述:
第一行2个整数 n, m;
第二行n个整数x,分别表示n件武器的重量。
1 <= n <= 100; 0 <= m <= 100; 1 <= x <= 100;
输出描述:
一个整数,表示Alice最多能拿走的武器总重量。
分析
随着n增大,有三个增大的值,左边天平重量,右边天平重量,天平之间的差值
所求也是天平之间的差值,最终判断也是天平之间的差值,天平之间的差值也能直接二重循环得到一个时间复杂度最小的值。
所以设dp[i][j] 表示前i个元素,放到左右两边的天平上,差值的绝对值为j的最大质量。
由于差值是相对的,可能会有负值,所以加一个abs函数将两个天平的差值确定,毕竟两个天平是等价的。
最后输出差值为0到m之间的,天平重量的最大值。
//-------------------------代码----------------------------
#define int LL
const int N = 1e4+10,M = 110;
int n,m;
int a[N];
int dp[M][N];
void solve()
{
cin>>n>>m;
fo(i,1,n) cin>>a[i];
memset(dp,-0x3f,sizeof dp);
dp[0][0] = 0;
fo(i,1,n) {
fo(j,0,N) {
dp[i][j] = max({dp[i-1][abs(j-a[i])] + a[i],
dp[i-1][abs(j+a[i])] + a[i],
dp[i-1][j]});
}
}
int mx = 0;
fo(i,0,m) {
mx = max(mx,dp[n][i]);
}
cout<<mx<<endl;
}
signed main(){
clapping();TLE;
// int t;cin>>t;while(t -- )
solve();
// {solve(); }
return 0;
}
/*样例区
*/
//------------------------------------------------------------