每一行都是一组测试案例 第一个数字 表示总和 第二个数字表示 一共有几个可用数据 现在 按照从小到大的顺序 输出 那些数字中若干数字之和为总和的 信息 /.
很好很明显的 遍历痕迹 , 多看多练
// 利用vector不定长数组 构图 然后就知道 某个节点相邻的 所有节点 #include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<set> #include<stack> #include<string> #include<sstream> #include<map> #include<cctype> using namespace std; int a[105],n,b[105],visited[105],q,m,mark; // 一共有几个数字 ? 数字储存 void DFS(int s,int sum) // 先 弄第一个 { if(sum>m) // 这种 剪枝 能有一个就有一个 return ; if(sum==m) // 输出 { printf("%d",b[1]); for(int i=2;i<q;i++) printf("+%d",b[i]); printf(" "); mark=0; return ; } for(int i=1;i<=n;i++) { if(visited[i]) // 发现 已经 用过了 那就 直接下一步 吧 . continue; if(a[i]<=m-sum&&b[q-1]>=a[i]) // 能放进去 并且 是递减顺序 // 根据题目中的 要求 来限定条件 搜索 也算是一种 模拟呀 . { visited[i]=1; sum+=a[i]; b[q++]=a[i]; DFS(s,sum); q--; sum-=a[i]; visited[i]=0; while(a[i]==a[i+1]) /* 如果有两个相同的数字在一起 当以其中某一个数字为开头的话 从后面找到一个符合题意的解 轮到和这个数字相同的的数值的时候 会又出现以i从这样的情况所以需要直接这样跳过去*/ i++; // 不过 如果跳的时候 需要实现 有序排列 } } } int main() { while(scanf("%d%d",&m,&n),(n||m)) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); printf("Sums of %d: ",m); memset(visited,0,sizeof(visited)); mark=q=1; b[0]=1111111; DFS(1,0); if(mark) printf("NONE "); } }
人逢A题 , 精神爽 , 来一发改进版的 , 这个答案是做了http://www.cnblogs.com/A-FM/p/5334822.html Stick神题得到的启示
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 using namespace std; 15 int n,m,a[105],q,b[105],visited[105],flag; 16 void DFS(int sum,int mark,int index) 17 { 18 if(sum==m) 19 { 20 printf("%d",b[0]); 21 for(int i=1;i<mark;i++) 22 printf("+%d",b[i]); 23 printf(" "); 24 flag=0; 25 } 26 if(sum>m) 27 return ; 28 for(int i=index;i<n;i++) 29 { 30 if(visited[i]||(a[i]==a[i-1]&&!visited[i-1])) // 这一个和上一个相同而且 上一个 没用 这个就也不用了 31 continue; 32 if(sum+a[i]<=m) 33 { 34 visited[i]=1; 35 b[mark]=a[i]; 36 DFS(sum+a[i],mark+1,i+1); 37 visited[i]=0; 38 } 39 } 40 } 41 int main() 42 { 43 while(scanf("%d%d",&m,&n)&&(n||m)) 44 { 45 for(int i=0;i<n;i++) 46 scanf("%d",&a[i]); 47 memset(visited,0,sizeof(visited)); 48 printf("Sums of %d: ",m); 49 flag=1; 50 DFS(0,0,0); 51 if(flag) 52 printf("NONE "); 53 } 54 return 0; 55 }