//题意:给你1-500的分值的硬币,把他分成两堆,求最小的差值。 // 01背包 #include <cstring> #include <cstdio> #include <algorithm> using namespace std; int dp[50005],a[105]; int main() { int sum,i,j,m,n; scanf("%d",&m); while(m--) { scanf("%d",&n); sum=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); sum+=a[i]; } memset(dp,0,sizeof(dp)); dp[0]=1; for(i=0;i<n;i++) { for(j=sum;j>=a[i];j--) { if(!dp[j]) dp[j]=dp[j-a[i]]; } } for(i=sum/2;i>=0;i--) { if(dp[i]) { printf("%d\n",sum-i-i);break; } } } return 0; }
原文:http://blog.csdn.net/littlefool5201314/article/details/22502159