原题地址:http://www.rqnoj.cn/problem/72
解题思路:基本的01背包问题。
要求的就是在这些人中选出一些人,使得这些人的体重的和 不超过所有人的体重的一半 并最大。
代码:
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 int w[105]; 5 int t; 6 int dp[105][10005]; 7 int s; 8 int max(int a,int b) 9 { 10 return a>b?a:b; 11 } 12 int main() 13 { 14 int i,j; 15 cin>>t; 16 int ss=0; 17 for(i=0;i<t;i++) 18 { 19 scanf("%d",&w[i]); 20 ss+=w[i]; 21 } 22 s=ss/2; 23 for(j=0;j<s;j++) 24 { 25 if(j>=w[i]) dp[0][j]=w[i]; 26 else dp[0][j]=0; 27 } 28 for(i=1;i<t;i++) 29 { 30 for(j=0;j<=s;j++) 31 { 32 if(j<w[i]) dp[i][j]=dp[i-1][j]; 33 else dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+w[i]); 34 } 35 } 36 printf("%d ",ss-2*dp[t-1][s]); 37 return 0; 38 }