3-3 训练专题(一)问题 B: 组数总和

题目描述

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;
}
发布了34 篇原创文章 · 获赞 6 · 访问量 1354

猜你喜欢

转载自blog.csdn.net/qq_44669377/article/details/104643268
3-3