一些有关于递归以及dfs(深度优先搜索算法)的总结,主要依据这个题。
本题目题面:
给你N个整数,从中选取任意多个(至少选择一个),输出所有可能的选择方案,
无需输出每个数字,只需要输出选择数字的和。
输入格式
第一样输入一个整数 n。 第二行输入n个整数。1<=n<=10
输出格式
输出所有的方案,注意输出要按字典序。 即按如下次序 a1 a1+a2 a1+a2+a3 a1+a2+a3...... a2 a2+a3 a2+a3+...... ...... an
输入样例
3 240 300 360
输出样例
240 540 900 600 300 660 360
总结
先读懂题意,以给出的例子来说,就是有三个数,然后随意组合输出不小于一个数的和。
可以用dfs算法。
首先先找到边界,及给出的n,当我们超过n时,递归结束。否则可以输出sum值
if(a==b+1) return ;
接着有两种情况,就是我们选择给还是不给这个数。
先让sum=0,然后按照顺序一层一层的来,从第一个数开始,给还是不给。
如果给,那么此时输出的sum=sum+a[i],i为对应的层数。
如果不给,则sum=sum,继续递归,一次一次直至到达边界。
void dfs(int a,int b,int sum,int st[ ]) { if(a==b+1) return ; printf("%d\n",sum+st[a]); dfs(a+1,b,sum+st[a],st); dfs(a+1,b,sum,st); }
接着调用函数,记得从第一层开始。
具体代码如下
#include<stdio.h> int n; int sum=0; int st[20];//标记函数 void dfs(int a,int b,int sum,int st[ ]) { if(a==b+1) return ; printf("%d\n",sum+st[a]); dfs(a+1,b,sum+st[a],st); dfs(a+1,b,sum,st); } int main() { int n; scanf("%d",&n); int i; for(i=1;i<=n;i++) scanf("%d",&st[i]); dfs(1,n,sum,st);//a=1,b=n,从一开始搜素到n结束 return 0; }