UVA, 562 Dividing coins
题意:给你n组数据,每组数据首先输入一个m,代表m个硬币的值,求将这些硬币分为俩堆,俩堆硬币值差值最小
…………ps:最开始一头雾水……然后看到了某位大神说这是背包问题,结果曲解了大神的意思,捣鼓了半天错误代码,最后仔细看了看大神的代码,然后,就没有然后了 (╯‵□′)╯︵┻━┻
思路:动态规划,子集和加总,背包
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 6 using namespace std; 7 int n,m,coin[101]; 8 int sum; 9 bool f[1000000]; 10 11 void datecin(int m) 12 { 13 sum=0; 14 for(int i=0;i<m;i++) 15 { 16 scanf("%d",&coin[i]); 17 sum+=coin[i]; 18 } 19 memset(f,0,sizeof(f)); 20 } 21 void datecal(int weight,int num) 22 { 23 f[0]=1; 24 for(int i=0;i<num;i++)//统计coin[0]~[num]]的和 25 { 26 for(int j=weight;j>=coin[i];j--) 27 { 28 if(f[j-coin[i]]==1) 29 f[j]=1; 30 } 31 } 32 for(int i=sum/2;i>=0;i--) 33 { 34 if(f[i]==1) 35 { 36 printf("%d\n",sum-2*i); 37 return ; 38 } 39 } 40 } 41 int main() 42 { 43 scanf("%d",&n); 44 while(n--) 45 { 46 scanf("%d",&m); 47 datecin(m); 48 datecal(sum,m); 49 } 50 return 0; 51 }