[NC19158]失衡天平
失衡天平
https://ac.nowcoder.com/acm/problem/19158
题解:动态规划我们设方程为dp[i][j]代表前i个元素相差j的时候最大的重量是多少。
dp[i][j]=max(dp[i-1][j],dp[i][j]); dp[i][j+a[i]]=max(dp[i][j+a[i]],dp[i-1][j]+a[i]); dp[i][j-a[i]]=max(dp[i][j-a[i]],dp[i-1][j]+a[i]);
今天的要由昨天的递推过来。
为什么会有一个j+a[i]和一个j-a[i],
分别代表着把第i个物品放在同侧
和把第i个物品放在右侧。
这里的代码没用abs,所以开了一倍长的空间记录放在右侧的情况
特别注意一点就是起始点不能为0,也就是dp[0][10000]=0要有这句话
/*Keep on going Never give up*/ #pragma GCC optimize(3,"Ofast","inline") #include <bits/stdc++.h> const int maxn = 110; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const int mod = 100000000; using namespace std; int n,m; int a[maxn]; int dp[110][20010]; int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=0;i<=100;i++){ for(int j=0;j<=20000;j++){ dp[i][j]=MinN; } } dp[0][10000]=0; for(int i=1;i<=n;i++){ for(int j=0;j<=20000;j++){ dp[i][j]=max(dp[i-1][j],dp[i][j]); if(j+a[i]<=20000) dp[i][j+a[i]]=max(dp[i][j+a[i]],dp[i-1][j]+a[i]); if(j-a[i]>=0) dp[i][j-a[i]]=max(dp[i][j-a[i]],dp[i-1][j]+a[i]); } } int ans=0; for(int i=0;i<=m;i++){ ans=max(ans,dp[n][10000+i]); ans=max(ans,dp[n][10000-i]); } cout<<ans<<endl; return 0; }
题解 文章被收录于专栏
主要写一些题目的题解