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
题意:就是给定一个数(总和),然后给定n个数,让你求满足总和的所有不同的组合并输出这些组合
思路:深搜,从第0个开始深搜,当第0个的所有组合满足后,进行下一个与当前不同数的搜索,
AC代码:
#include <iostream>
#include <cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int t;
int n;
int sum;
int tag,k;
int a[13];//给定的数
int b[13];//记录满足条件的数
void dfs(int x){
int i;
if(sum>t){
return ;
}
if(sum==t){//输出
for(int j=0;j<k-1;j++){
printf("%d+",b[j]);
}
printf("%d\n",b[k-1]);
tag=1;
return;
}
for(i=x;i<n;i++){
sum+=a[i];
b[k++]=a[i];
dfs(i+1);//搜索下一个
sum-=a[i];
while(i+1<n&&a[i]==a[i+1]){ i++;}//回溯回去的时候避免搜索相同的数
k--;
}
}
int main(){
while(~scanf("%d",&t)){
scanf("%d",&n);
if(n==0){break;}
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sum=0;
tag=0;
k=0;
printf("Sums of %d:\n",t);
dfs(0);
if(tag==0){
printf("NONE\n");
}
}
return 0;
}
注意;哪里必须避开搜素相同的数,深搜的想法主要感觉是回溯,回溯回去后倒地怎么来操作;
这种题看着简单,做起来也不容易,,,,菜,,,继续努力。。。。。