http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1007
01背包//需要多做这种题 能看到题想到这个思路
如果sum为奇数 比如 sum=5,那么sum/2 就是2 所以 总共的sum -dp[sum/2] 就是较大的那一块分类
然后dp[sum/2]就是较小的
然后两者做差就是 相差最少的
#include<bits/stdc++.h> using namespace std; const int maxn = 10010; int dp[maxn]; int s[110]; int main () { int n,sum=0; cin >> n; for(int i=1;i<=n;i++) { cin >> s[i]; sum+=s[i]; } for(int i=1;i<=n;i++) { for(int j=sum/2;j>=s[i];j--) dp[j] = max(dp[j],dp[j-s[i]]+s[i]); } cout << sum-dp[sum/2]-dp[sum/2]<<endl; }