我对这个算法问题有点困难。假设您必须使用(x)数量,找出给定总和(y)的所有可能结果。
假设我的x = 3且我的总和是60.我必须弄清楚所有可能的情况。例如
1,1,58
,1,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吗?
答案 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();
}
}