弄清楚如何循环(x数之和= y的总和)

时间:2016-09-02 15:58:47

标签: php algorithm

我对这个算法问题有点困难。假设您必须使用(x)数量,找出给定总和(y)的所有可能结果。

假设我的x = 3且我的总和是60.我必须弄清楚所有可能的情况。例如     1,1,581,2,57等等......它有点复杂,但在这里并不重要。

我可以算出x = 2,x = 3,但它是手动完成的,我需要弄清楚如何动态地完成它。

    for ($first=$start; $first <= $highest_number; $first++) { //start = 1, highest_number = y / x which is 20 in this case.
        for ($inc=$start; $inc <= $end; $inc++) { //end = 40

            if ($x>= 3) { //assuming x = 3

                for ($n=$highest_number; $n <= $end ; $n++) { 
                    if ( $first + $inc + $n == $target ) {
                        $result['result'][] = $first .",". $inc .",". $n;
                    }
                }

            } else  { // assuming x = 2
                if ($first + $inc == $target) {
                    $result['result'][] = $first .",". $inc;
                }
            }
        }
    }

这就是我被困住的地方。显然我现在正在使用x = 2,x = 3的条件。动态做到最好的方法是什么?我在想递归函数,我没有任何工作,但这就是我想象的样子:

    //recursion - does not work, not sure how to make it work
    $z = 1;
    function test($x, $first, $inc){
        while ($z<= $x) {

            //this is where I'm stuck. How do i form my loop so that it works dynamically. 
            for ($n=$start; $n <= $end ; $n++) { 

            }

        }
    }

任何人都可以提供有关如何形成递归函数的提示,以便它可以计算等式中任意数量的x吗?

1 个答案:

答案 0 :(得分:0)

这是nHr组合,其中n = y,r = x-y。

#include<iostream>
#include<map>
using namespace std;

class nHr
{
public:
    nHr(int n, int r) {
        this->n = n;
        this->r = r;
        ar = new int[r];
    }
    int* ar;
    int n, r;
    bool next() {
        ar[r-1]++;
        int i = r-1;
        while(ar[i] == n+1) {
            if(--i == -1) return false;
            ar[i]++;
        }
        while(i < r-1) ar[i+1] = ar[i++];
        return true;
    }
    int operator[](int n) {return ar[n];}
};

int main(int c, char** v)
{
    if(c < 3) return 0;
    int x = atoi(v[1]);
    int y = atoi(v[2]);
    nHr nhr(y, x-y);
    map<int, int> m;
    while(nhr.next()) {
        for(int i=1; i<=y; i++) m[i]++;
        for(int i=0; i<x-y; i++) m[nhr[i]]++;
        for(auto& a : m) cout << a.second << ',';
        cout << endl;
        m.clear();
    }
}

enter image description here