Firstly, a bit of math here:
Say there are 4 numbers, num1, num2, num3 and num4, which need to sum up to 11.So,
num1+num2+num3+num4=11
num1=1 and num2>=2, num3>=2, num4>=2
num2+num3+num4=11-num1=10
(num2-2)+(num3-2)+(num4-2)=10-(2+2+2)=4
var2+var3+var4=4, where var2, var3 and var4>=0
Which boils down to finding 3 non negative numbers such that they sum to 4, in a recursive manner. Here's a general solution which can then be modified accordingly:
Here's a code which can do that, in C++:
#include <iostream>
#include <vector>
void get_target_sum(std::vector<std::vector<int>>& total_ans, std::vector<int>& curr_ans, int num_remaining, int targetnum){
// total_ans denotes all the tuples, curr_ans denotes the current
// computation, num_remaining denotes the numbers remaining which
// should sum up to targetnum.
// each time we find a valid number which can be a part of our answer, we
// add it to curr_ans, decrement num_remaining since the numbers remaining
// has decreased by 1, and decrease the target number to be found by the
// value of the number
if(num_remaining<1){return;}
if(num_remaining==1){
curr_ans.push_back(targetnum);
total_ans.push_back(curr_ans);
curr_ans.pop_back();
}
for(int curr_num=0;curr_num<targetnum;curr_num++){
curr_ans.push_back(curr_num);
get_target_sum(total_ans,curr_ans,num_remaining-1,targetnum-curr_num);
curr_ans.pop_back();
}
}
int main()
{
std::vector<std::vector<int>>final_ans;
std::vector<int> curr_ans;
get_target_sum(final_ans,curr_ans,3,4);
for(int i=0;i<final_ans.size();i++){
std::cout<<1<<" ";
// The first variable
for(auto num:final_ans[i]){
std::cout<<num+2<<" ";
// the other 3 variables, incremented by 2.
}
std::cout<<"\n";
}
return 0;
}
The Output: https://onlinegdb.com/gdQdLgni8
for(int i = 1 ; i < 7; i ++ )ifihas to be1?! Similarly,for(int p = 2; p < 7; p ++ )also makes no sense.pis always going to be11 - i - k - j.p = 10 - (j + k)...