查找一个三元组,将其给定值相加

时间:2018-07-23 13:46:53

标签: c++ sum

我一直在努力解决一个问题,即我必须根据给定的数字找到所有三和得出给定的数字。

例如,如果给定数字为5,则条件为:(x+y+z=5x<=y<=z):

输入:

5

输出:

0 0 5
0 1 4
0 2 3
1 1 3
1 2 2

我试图找到所有以0开头的解决方案,但我不知道如何找到以123开头的解决方案等

到目前为止,我有什么:

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--;
    }
}

感谢帮助!

2 个答案:

答案 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 55 0 0,我将留给您找出方法。

只需将结果添加到临时holder中,然后递归尝试所有组合。直到您达到目标值0,因为我们要减去或遇到错误情况。回溯并弹出值并耗尽所有组合。如果我们达到目标,请存储结果。

Live Demo

答案 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