题目网址:http://acm.nyist.net/JudgeOnline/problem.php?pid=325
这道题解题的技巧类似NYOJ-1058部分和问题,就是代码第12行的位置:i 是从cur+1位置开始的。
这点是解决某一类问题的关键。此类题有一个共同之处就是:无序 和 无重复性。拿这题来说就是:我从中选取一部分的数,
使得选中的和与剩下的和之差最小。我选中的这些数,不用管他的顺序怎么样,我直接从0位置开选就可以;取数是从前往后依次取(无重复性)。
如果w[0]是问题解的一部分,那么我从剩下的再选即可。以w[0]为根的递归树中,再选择下一个可行的元素。
说的不怎么清晰,关键就一点:无序。才可以用这个技巧。
1 #include <stdio.h> 2 #include <stdlib.h> 3 int N,M,sum; 4 int w[50]; 5 int flag[50]; 6 int cha; 7 8 void dfs(int cur,int sum_c){ 9 if(abs(sum - 2 * sum_c) < cha){ 10 cha = abs(sum - 2 * sum_c); 11 } 12 for(int i = cur + 1; i < N; i++){ 13 dfs(i,sum_c + w[i]); 14 } 15 } 16 17 int main(void){ 18 int i; 19 while(scanf("%d",&N) != EOF){ 20 M = N; 21 sum = 0; cha = 20000; 22 for(i = 0; i < N; i++){ 23 scanf("%d",&w[i]); 24 sum += w[i]; 25 } 26 for(int j = 0; j < N; j++){ 27 dfs(j,w[j]); 28 } 29 printf("%d ",cha); 30 } 31 return 0; 32 }