题目描述
LZY今天又突发奇想了,他想随意给出两个数字n和k,请你找出所有N个数字相加和为K的组合数量。组合中只含有1——9的数字,并且不允许重复。
输入
测试样例由多组测试数据组成。每组测试样例第一行输入两个正整数n ( 1 <= n <= 9 ) 和 k < ( 1 <= k <= 45 )。
输出
输出所有符合题目要求的组合数量。如果组合不存在,请输出 No list
样例输入
3 7
3 9
样例输出
1
3
思路:
数据不能重复,所以把所有数据从 1,2,3。。。开始跑。
每次右边的数字不能大于等于左边的数字。
temp.size( ) > 0 && i <= temp [ temp.size( ) - 1 ] ;
在代码中先写入最终裁决条件,所选的数字等于能有的数量n,并且总数sum等于和k;
if ( temp.size( ) == n ){
if ( sum == k ) {
..........
}
return ;
}
然后暴力跑就好。。。
AC代码:
#include<bits/stdc++.h>
using namespace std;
vector<int> temp;
int n,m,flag,ans;
void dfs(vector<int> &temp,int sum){
if(temp.size()==n){
if(sum==k){
flag=1;
ans++;
}
return;
}
for(int i=1;i<=9;i++){
if(temp.size()>0 && i<=temp[temp.size()-1])continue;
if(sum+i>k) {
continue;
}
sum=i+sum;
temp.push_back(i);
dfs(temp,sum);
temp.pop_back();
sum-=i;
}
return;
}
int main(){
while(cin>>n>>k){
flag=0;
ans=0;
dfs(temp,0);
if(!flag){
cout<<"No list"<<endl;
}else{
cout<<ans<<endl;
}
}
return 0;
}