给出一个n,k,再给出的n个数中,输出所有的可能使几个数的和等于k
Sample Input
4 6 4 3 2 2 1 1
5 3 2 1 1
400 12 50 50 50 50 50 50 25 25 25 25 25 25
0 0
Sample Output
Sums of 4:
4
3+1
2+2
2+1+1
Sums of 5:
NONE
Sums of 400:
50+50+50+50+50+50+25+25+25+25
50+50+50+50+50+25+25+25+25+25+25
明显的DFS,这个dfs方程让我纠结啊,递归的我头都大了,但是看下答案稍微来点灵感了,在这里dfs函数方程要有哪些参数?
首先要从当前数往后开始dfs,所以要有个参数是当前搜索的数组下标
其次,要判断和=t,所以还要有个保存当前的和的参数,在这里我用t减去当前和,所以当此参数等于0那么就是找到满足条件
最后要输出此序列,所以还要有个参数来标记当前要找的数在数组里的位置
找到三个参数后就好办多了,看代码吧
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,t;
int num[101];
int r[101];
bool flag;
void dfs(int len,int k,int last)
{
int result;
if(last==0)
{
flag=false;
for(int i=0;i<len;i++)
if(i==0)printf("%d",r[i]);
else printf("+%d",r[i]);
printf("\n");
return ;
}
for(int i=k;i<n;i++)
{
if(i==k||num[i]!=num[i-1]&&last-num[i]>=0)// 去除重复的操作
{
r[len]=num[i];
dfs(len+1,i+1,last-num[i]);
}
}
}
int main()
{
while(scanf("%d%d",&t,&n)!=EOF)
{
if(t==n&&n==0)break;
flag=true;
for(int i=0;i<n;i++)
scanf("%d",&num[i]);
printf("Sums of %d:\n", t);
dfs(0,0,t);
if(flag)printf("NONE\n");
}
}

浙公网安备 33010602011771号