LZY今天又突发奇想了,他想随意给出两个数字n和k,请你找出所有N个数字相加和为K的组合数量。组合中只含有1——9的数字,并且不允许重复。
输入
测试样例由多组测试数据组成。每组测试样例第一行输入两个正整数n ( 1 <= n <= 9 ) 和 k < ( 1 <= k <= 45 )。
输出
输出所有符合题目要求的组合数量。如果组合不存在,请输出 No list
样例输入 Copy
3 7
3 9
样例输出 Copy
1
3
#include<bits/stdc++.h>
using namespace std;
int n,k;
int ans=0;
int flag=0;
int vis[10];
void dfs(vector<int>&temp,int sum){
if(temp.size()==k){
if(sum==n){
flag=1;
ans++;
}
return;
}
for(int i=1;i<=9;i++){
if(vis[i]==1)
continue;
if(temp.size()>0&&i>temp[temp.size()-1])
continue;
if(sum+i>n)
continue;
vis[i]=1;
sum+=i;
temp.push_back(i);
dfs(temp,sum);
temp.pop_back();
sum-=i;
vis[i]=0;
}
}
int main(){
while(cin>>k>>n){
memset(vis,0,sizeof(vis));
ans=0;
flag=0;
vector<int> temp;
dfs(temp,0);
if(flag==1) cout<<ans<<endl;
else cout<<"No list"<<endl;
}
return 0;
}