思路
只有1-9且不能重复,所以用for从一到九循环
用vis判断是否使用过数字
因为会出现重复数字的不同排列,所以还要剪枝
代码
#include<bits/stdc++.h>
using namespace std;
int k,n;
int vis[10];
int flag=0;
int ans = 0;
void dfs(vector<int>&temp,int sum){
if(temp.size()==k){ //长度为k时退出循环
if(sum==n){ //如果和为n,flag=1,输出答案,否则flag=0,No list
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])//新的i必定大于之前的,剪枝去重
continue;
if(sum+i>n) //sum大于n直接跳过,剪枝
continue;
vis[i]=1;
temp.push_back(i); //把i存进vector里
dfs(temp,sum+i); //递归
temp.pop_back(); //回溯
sum-=i;
vis[i]=0;
}
}
int main()
{
while(cin>>k>>n){
memset(vis,0,sizeof(vis)); //初始化
flag=0;
ans = 0;
vector<int>temp;
dfs(temp,0);
if(!flag)
cout<<"No list"<<endl;
else
cout<<ans<<endl;
}
return 0;
}