从哪里开始解决这个问题

时间:2015-04-12 19:44:31

标签: c set

您好我求助于您的帮助,意在向我表明,解决此问题必须遵循的步骤明确表示我不是要求解决问题的方法

给定一个集{1 ... N}我们可以将它分成两个子集,它们的和相同,例如N = 3:

{1,2} = {3}

N = 7的另一个例子:

{1,6,7} = {2,3,4,5}
{2,5,7} = {1,3,4,6}
{3,4,7} = {1,2,5,6}
{1,2,4,7} = {3,5,6}

给定一个N,计算我们可以用多少种方法来实现这个属性的子集,对于N = 3,我们已经看到有可能;对于N = 7,我们有4种可能性。制作一个递归算法,解决任何0< N< 39。

Example input:
7
The function must be given:
3
Example input 2:
3
Example output 2
1

欢迎任何援助

修改

#include<stdio.h>

int count( int S[], int m, int n )
{
     if (n == 0)
       return 1;


    if (n < 0)
        return 0;
    if (m <=0 && n >= 1)
        return 0;
    return count( S, m - 1, n ) + count( S, m, n-S[m-1] );
}
int main()
{
    int arr[] = {1,2};
    int m = sizeof(arr)/sizeof(arr[0]);
    printf("%d ", count(arr, m, 3));

    return 0;
}

在这种情况下,两个人给了我而不是一个错误的

1 个答案:

答案 0 :(得分:1)

您可以使用值的总和为n *(n + 1)/ 2的事实。你的任务是找到所有n *(n + 1)/ 4的集合。为此,您可以使用更改算法(根据您的要求递归)。你的硬币是1到N的整数,你要分配的钱是n *(n + 1)/ 4。

来源:http://en.wikipedia.org/wiki/Change-making_problem