背包问题。
不过就这道题目本身而言,由于集合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("\b\b= 10.\n"); 30 } 31 } 32 printf("\nTotal: %d.\n", count); 33 34 return 0; 35 }
来源:http://xiaozunyan.blog.sohu.com/3534370.html
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。