NYOJ-zb的生日

 题目网址: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 }
原文地址:https://www.cnblogs.com/yfs123456/p/5609181.html