题目描述
给定整数n,取若干个1到n的整数可求和等于整数m,编程求出所有组合的个数。比如当n=6,m=8时,有四种组合:[2,6], [3,5], [1,2,5], [1,3,4]。限定n和m小于120
输入描述:
整数n和m
输出描述:
求和等于m的所有组合的个数。
示例1
输入
6 8
输出
4
说明
这道题目用DFS暴搜的方法,只能解决80%的数据,剩下20%的数据需要用高级的动态规化解决。
#include <iostream>
#include <vector>
using namespace std;
void helper(vector<int> nums, int start,int target, int &res)
{
if(target==0){
res++;
return;
}
else if(target<0) return;
for(int i=start;i<nums.size();i++){
if(nums[i]<=target)
helper(nums,i+1,target-nums[i],res);
else
break;
}
}
int main()
{
int n,m,res=0;
cin>>n>>m;
vector<int> nums;
for(int i=1;i<=n;i++) nums.push_back(i);
helper(nums,0,m,res);
cout<<res<<endl;
}