题目描述
LZY今天又突发奇想了,他想随意给出两个数字n和k,请你找出所有N个数字相加和为K的组合数量。组合中只含有1——9的数字,并且不允许重复。
输入
测试样例由多组测试数据组成。每组测试样例第一行输入两个正整数n ( 1 <= n <= 9 ) 和 k < ( 1 <= k <= 45 )。
输出
输出所有符合题目要求的组合数量。如果组合不存在,请输出 No list
样例输入
3 7
3 9
样例输出
1
3
总结:这题也是用到了dfs算法,自从会搜索的一点皮毛之后,发现搜索真的很好用,dfs真香啊。
代码(DFS)
#include<bits/stdc++.h>
using namespace std;
int n,m,k,vis[15],flag;
void dfs(vector<int>& v,int sum){
if(v.size()==n){
if(sum==m){
k++;
flag=1;
}
return;
}
for(int i=1;i<=9;i++){
if(vis[i]==1)
continue;
if(sum+i>m)
continue;
if(v.size()>0&&i<v[v.size()-1])
continue;
vis[i]=1;
sum+=i;
v.push_back(i);
dfs(v,sum);
v.pop_back();
sum-=i;
vis[i]=0;
}
return;
}
int main(){
while(cin>>n>>m){ //n个数和为m
k=0,flag=0;
memset(vis,0,sizeof(vis));
vector<int >v;
dfs(v,0);
if(flag==1) cout<<k<<endl;
else cout<<"No list"<<endl;
}
}