这是GeeksforGeeks的问题。
你可以赢得三种篮球分,1分,2分和3分。给定总分n,打印出所有组合以组成n。我已经实现了以下解决方案。但我正在多次打印一些值。喜欢2,我正在
2
1 1
2
1 1
我无法找出它出错的地方。
#include<iostream>
#include<vector>
using namespace std;
void print(vector<int>& A){
for(int i=0;i<A.size();i++)
cout<<A[i]<<" ";
cout<<endl;
}
void fun(int x,int m,vector<int>& A){
for(int i=m;i>0;i--){
if(x-i==0){
A.push_back(i);
print(A);
A.pop_back();
}
else if(x-i>0){
A.push_back(i);
fun(x-i,i,A);
A.pop_back();
}
else{
fun(x,i,A);
}
}
}
int main(){
int n;
cin>>n;
vector<int> A;
fun(n,3,A);
}
答案 0 :(得分:3)
您的代码有一个多余的电话......特别是部分
...
else {
fun(x,i,A);
}
没有意义。
只有当您减去的点数没有超过或达到总数时,您才需要递归。您正确处理了两个案例(x-i==0)
和(x-i>0)
,但对于(x-i<0)
,您必须无所作为。