思路: 我们拿到一个新的武器之后,有三种状态:
①放到天平左边
②放到天平右边
③不要这个武器
那么状态转移方程就为:
dp[i][j]=max( dp[i-1][j] , max( dp[i-1][j+va[i]] , dp[i-1][abs(j-va[i])] )+va[i] );
(dp[i][j]表示前i个武器在天平差值为j的时候的最大值,va[i]表示第i个武器的重量)
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> #include <stack> #include <queue> #include <cmath> #define ll long long #define pi 3.1415927 #define inf 0x3f3f3f3f #define mod 1000000007 using namespace std; int dp[105][10105],va[105]; int main () { int T,n,m,i,t,j,k,p; cin>>n>>m; for(i=1;i<=n;++i) cin>>va[i]; memset(dp,-inf,sizeof(dp)); dp[0][0]=0; for(i=1;i<=n;++i) for(t=0;t<=10000;++t) { dp[i][t]=max(dp[i-1][t],max(dp[i-1][t+va[i]],dp[i-1][abs(t-va[i])])+va[i]); } int maxs=0; for(i=0;i<=m;++i) //cout<<dp[n][i]<<endl; maxs=max(maxs,dp[n][i]); cout<<maxs<<endl; return 0; }