(转载) 数组a[]={3,5,2,4,1,8},要求从a中找出所有“和”等于10的子集

背包问题。  
  不过就这道题目本身而言,由于集合a中只要6个元素,而不是成千上万,所以可以使用更直观的办法:  
  只要你能通过程序给出数组a中元素所组成的集合的所有的子集合(幂集),那么只需在这些集合中搜索等于10的就可以了。  
  而6个元素构成的集合的幂集可以通过6位二进制数来表示,对于从0到2的6次方减1(63)之间的所有的数,让其每一位比特位代表一个元素,当该位为0时 表示该数所表示的子集中没有这个元素,否则表示拥有这个元素,这样就能对应出所有的组合,然后在这些所有的组合中检测和是否为10就可以了。

 1 #include   <stdio.h>  
 2    
 3   #define   ARRAY_SIZE 6  
 4   #define   MAX_NUM (1<<ARRAY_SIZE)  
 5   int   main()  
 6   {  
 7   int   i,   j;  
 8   int   sum;  
 9   int   a[ARRAY_SIZE]   =   {3,5,2,4,1,8};  
10   int   count   =   0;  
11    
12   for(i   =   0;   i   <   MAX_NUM;   i++)  
13   {  
14   sum   =   0;  
15   for(j   =   0;   j   <   ARRAY_SIZE;   j++)  
16   {  
17   if(i   &   (1   <<   j))  
18   sum   +=   a[j];  
19   }  
20    
21   if(10   ==   sum)  
22   {  
23   printf("%d:   ",   ++count);  
24   for(j   =   0;   j   <   ARRAY_SIZE;   j++)  
25   {  
26   if(i   &   (1   <<   j))  
27   printf("%d   +   ",   a[j]);  
28   }  
29   printf("=   10.
");  
30   }  
31   }  
32   printf("
Total:   %d.
",   count);  
33    
34   return   0;  
35   } 

来源:http://xiaozunyan.blog.sohu.com/3534370.html

原文地址:https://www.cnblogs.com/heyonggang/p/3170935.html