我一直在努力解决一个问题,即我必须根据给定的数字找到所有三和得出给定的数字。
例如,如果给定数字为5
,则条件为:(x+y+z=5
和x<=y<=z
):
输入:
5
输出:
0 0 5
0 1 4
0 2 3
1 1 3
1 2 2
我试图找到所有以0
开头的解决方案,但我不知道如何找到以1
,2
,3
开头的解决方案等
到目前为止,我有什么:
int x,y,z;
void showSolutions(int c) {
z=c;
while((x<=y) && (y<=z)) {
if((x<=y&&y<=z)&&(x+y+z)==c) {
cout<<x<<" "<<y<<" "<<z;
cout<<"\n";
}
y++;
z--;
}
}
感谢帮助!
答案 0 :(得分:0)
您可以递归地考虑这一点,让我尝试指出一个适用于两个数字或三元组或更多的通用方法。
class sum
{
public:
vector<vector<int>> triplets(int k, int target)
{
vector<vector<int>> result;
vector<int> holder;
getTriplets(k, target, holder, result);
return result;
}
void getTriplets(int k, int target, vector<int>& holder, vector<vector<int>>& result)
{
if(target < 0) return;
if(k < 0) return;
if(k == 0 && target == 0)
{
result.push_back(holder);
return;
}
for(int i = 0; i <= target; ++i)
{
holder.push_back(i);
getTriplets(k-1, target - i, holder, result);
holder.pop_back();
}
}
};
您可以通过以下方式调用它:
sum s;
auto res = s.triplets(3,5);
for(auto row : res)
{
for(auto col : row) cout << col << " ";
cout << endl;
}
其中,triplet的第一个参数是所需集合的大小,而后者是garget值。这里的问题是,它将产生重复的0 0 5
和5 0 0
,我将留给您找出方法。
只需将结果添加到临时holder
中,然后递归尝试所有组合。直到您达到目标值0
,因为我们要减去或遇到错误情况。回溯并弹出值并耗尽所有组合。如果我们达到目标,请存储结果。
答案 1 :(得分:0)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int x,y,z;
for(z=n;z>=0;z--)
{
for(y=0;y<=z && z+y<=n;y++)
{
x=n-(y+z);
if(x<=y)
cout<<x<<y<<z<<endl;
}
}
}
对于n = 5,您得到
005
014
113
023
122