#include <stdlib.h> #include <stdio.h> int maxSum[20][100][20]; int num[20]; int getMaxSum(int n,int sum) { sum/=2; int k=n/2; for(int i=0;i<=sum;++i) { maxSum[n+1][i][0]=0; } for(int i=n;i>=1;--i) { for(int j=0;j<=k;++j) { for(int m=0;m<=sum;++m) { if(n-i+1>=j) { int a=(m-num[i])>=0? maxSum[i+1][m-num[i]][j-1]+num[i]:0; int b=maxSum[i+1][m][j]; maxSum[i][m][j]=a<b? b:a; } } } } return maxSum[1][sum][k]; } int main() { int n,sum=0; scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&num[i]); sum+=num[i]; } printf("%d",getMaxSum(n,sum)); return 0; } 和背包基本一样,属于不要求填满的那种背包问题,也属于背包问题的一个变种