[2016-05-11][51nod][1007 正整数分组]

  • 时间:2016-05-11 15:37:21 星期三

  • 题目编号:[2016-05-11][51nod][1007 正整数分组]

  • 题目大意:将一堆正整数分为2组,要求2组的和相差最小。

  • 分析:分成组,两组之和越接近总和的一半,差值越小

    • 题目就变成了,把体积为ai,价值也为ai的物品i,放入容积为 sum / 2的背包中,问最多能放多少
    • 得到的最大值,就是其中一组的和,由此可以算出答案
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<algorithm>
  4. using namespace std;
  5. const int maxn = 1E4 + 10;
  6. int a[maxn],dp[maxn];
  7. int main(){
  8. int n,sum = 0;
  9. scanf("%d",&n);
  10. for(int i = 0 ; i < n ; ++i){
  11. scanf("%d",&a[i]);
  12. sum += a[i];
  13. }
  14. for(int i = 0 ; i < n ; ++i){
  15. for(int j = sum / 2 ; j >= a[i] ; --j){
  16. dp[j] = max(dp[j] , dp[j - a[i]] + a[i]);
  17. }
  18. }
  19. printf("%d\n",abs(dp[sum / 2] - (sum - dp[sum / 2])));
  20. return 0;
  21. }


来自为知笔记(Wiz)


posted on 2016-05-11 15:40  红洋  阅读(253)  评论(0编辑  收藏  举报

导航