动态规划问题。
确定状态:在某物品要产生的重量差的数值能够放多少重量取决于这个物品会放到天平中的那一边或轻的那一边或不放。有这三种情况之后产生的差值就是上一个物品产生的差值中能够放物品的最大值了。那么递推式为:dp[i][j] = max(dp[i-1][j+a[i]]+a[i], dp[i-1][abs(j-a[i])]+a[i], dp[i-1][j])。对于每一个物品得到他们各种重量差的最大重量,而对于每一个物品某个重量差的最大重量又取决于加上这个物品之后产生的重量差的最大重量,那么就是上一个物品对应重量差的最大重量。
那么就需要将初始所有的dp数组都置为最小值,在一个不放的情况下dp[0][0] = 0;
#include <bits/stdc++.h> using namespace std; const int maxn = 10001; int inf = INT_MIN; int dp[101][maxn]; int a[maxn]; int main() { int n, m, sum = 0; cin>>n>>m; for (int i=1;i<=n;i++) { cin>>a[i]; sum+=a[i]; } memset(dp, -10005, sizeof(dp)); dp[0][0] = 0; int ans = -1; for (int i=1;i<=n;i++) { for (int j=0;j<=10000;j++) { dp[i][j] = dp[i-1][j]; int temp = max(dp[i-1][j+a[i]]+a[i], dp[i-1][abs(j-a[i])]+a[i]); dp[i][j] = max(dp[i][j], temp); } } for (int j=0;j<=m;j++) { ans = max(ans, dp[n][j]); } cout<<ans; return 0; }