C Brute Force递归函数

时间:2013-02-23 00:28:30

标签: c recursion brute-force

所以我在使用递归函数时遇到了麻烦,我的问题是我有一个表示金币的数组,这是一个[]这个数组有硬币,需要与两个用户共享,方式是每个用户在长运行得到相同数量的黄金或最佳解决方案......像这样

Gold
10 6 5 2
User A : gets 10 2
User B : gets 6 5

用户A和用户B之间的绝对值给出了不同之处。 在这种情况下,它将是1

要解决这个问题,我需要通过所有可能的组合,这就是为什么我使用强力和递归函数...为了做到这一点,我必须运行每一个组合,看看两者之间的绝对差异,如果它比它更好以前的我把它保存在全局变量中最好...

问题是功能根本不起作用..如果你帮助我,我将不胜感激......

代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int best = 0; // keeps the best option



int share_friends_recursive(int nelems,int a[],int friend_a,int friend_b,int i){
    int sub = 0;
    friend_a += a[i];
    friend_b += a[i+1];
    if(i+1 == nelems){

        return 0;
    }else{
        sub = abs(friend_a - friend_b);
        if(sub < best){
            best = sub;
        }
        i++;
        share_friends_recursive(nelems,a,friend_a,friend_b,i);
    }

}

int main(int argc, char *argv[]) {
    //
    int nelems = 4;
    int a[] = {10,6,5,2};



    //friend A can get the first value
    // friend B gets the second one ...
    share_friends_recursive(nelems,a,0,1,0);
    printf("%d \n",best);

    return 0;
}

2 个答案:

答案 0 :(得分:2)

你需要考虑你在做什么。例如:

int share_friends_recursive(int nelems,int a[],int friend_a,int friend_b,int i){
    int sub = 0;
    friend_a += a[i];
    friend_b += a[i+1];

所以你要给第一堆扑灭A而第二堆给朋友B.但是你以后会以i增加1来递减,所以你要给第二堆即使你已经把它给了B.这没有任何意义。

你要做的是尝试将第一堆给A然后递归给出剩下的桩,然后重新开始,尝试将第一堆给B并递归给出剩下的桩并比较那些两个案例看哪个最好。

修改

好的,让我们一步一步来看看。你有递归功能:

int share_friends_recursive(int nelems,int a[],int friend_a,int friend_b,int i){

此处nelems是桩的总数,a是每个桩的大小,i是已经分配了多少桩,friend_a和{ {1}}给每个朋友多少钱。首先,如果我们分配了所有的桩怎么办?这个解决方案有多好?调用者需要知道,所以我们将返回它。

friend_b

告诉我们,当我们完成时,我们做得有多好(或多么糟糕)。如果我们没有完成怎么办?那么,我们需要尝试将堆 if (i == nelems) { return abs(friend_a - friend_b); 给予a和b,看看哪个更好。

i

那么哪个更好?好吧,我们只是比较并返回较低的一个:

    } else {
        int toA = share_friends_recursive(nelems, a, friend_a + a[i], friend_b, i+1);
        int toB = share_friends_recursive(nelems, a, friend_a, friend_b + a[i], i+1);

..这告诉我们最好的分裂是多么好。

答案 1 :(得分:0)

新代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int best = 10; // keeps the best option



int share_friends_recursive(int nelems,int a[],int friend_a,int friend_b,int i){
    if(i == nelems){

        return abs(friend_a - friend_b);
    }else{
    int n = abs(friend_a - friend_b);
        int toA = share_friends_recursive(nelems, a, friend_a + a[i],friend_b,i+1);
        int toB = share_friends_recursive(nelems, a, friend_a, friend_b + a[i],i+1);
        printf("[%d]: value A: %d, Value B: %d \n",i,toA,toB);
        if (toA <= toB)
            return toA;
        else
            return toB;
    }

}

int main(int argc, char *argv[]) {
    //
    int nelems = 4;
    int a[] = {10,6,5,2};



    //friend A can get the first value
    // friend B gets the second one ...
    best = share_friends_recursive(nelems,a,0,1,0);
    printf("%d \n",best);

    return 0;
}

在这种情况下,不是给1而是给0这是错误的,就像我在上面的例子中所示......我似乎无法找到这个案例的问题......如果有人可以帮助我,我会是apreciated ...

提供此程序的当前错误输出是:

[3]: value A: 22, Value B: 18 
[3]: value A: 12, Value B: 8 
[2]: value A: 18, Value B: 8 
[3]: value A: 10, Value B: 6 
[3]: value A: 0, Value B: 4 
[2]: value A: 6, Value B: 0 
[1]: value A: 8, Value B: 0 
[3]: value A: 2, Value B: 2 
[3]: value A: 8, Value B: 12 
[2]: value A: 2, Value B: 8 
[3]: value A: 10, Value B: 14 
[3]: value A: 20, Value B: 24 
[2]: value A: 10, Value B: 20 
[1]: value A: 2, Value B: 10 
[0]: value A: 0, Value B: 2 
0