EricYang

Tech Spot of Eric

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

有一个无序,元素个数为2n的正整数数组,把这个数组分成两个n的子数组,子数组和最接近?

 

将其转化为0/1背包问题,将容量为n的背包放入元素,元素的体积为1,重量为其大小,如何装使其接近于重量sum/2,

sum为2n的和。

 

 1 #include <iostream>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int n=5;
 9     int nArray[10] = {1,5,7,8,9,6,3,11,20,17};
10 
11     //0/1背包
12     int sum=0;
13     for(int i=0; i<2*n; i++)
14     {
15         sum+=nArray[i];
16     }
17     //容量为n的背包,装满n件物品时,能达到的价值,只考虑小于等于sum/2的价值
18     bool dp[n+1][sum/2+1];
19     memset(dp,0,sizeof(dp));
20     dp[0][0]=true;
21     for(int k=2*n-1; k>=0; k--)
22     {
23         for(int i=1; i<=n; i++)
24         {
25             for(int v=0; v<=sum/2; v++)
26             {
27                 if(dp[i-1][v] && v+nArray[k]<=sum/2)
28                 {
29                     dp[i][v+nArray[k]]=true;
30                 }
31             }
32         }
33     }
34     int maxV;
35     for(int v=sum/2; v>=0; v--)
36     {
37         if(dp[n][v])
38         {
39             maxV=v;
40             break;
41         }
42     }
43     cout<<maxV<<"/"<<sum<<endl;
44     return 0;
45 }
posted on 2012-08-11 15:33  Eric-Yang  阅读(249)  评论(0编辑  收藏  举报