【问题标题】:Dynamic Programming failing test case动态规划失败的测试用例
【发布时间】:2014-11-06 22:01:20
【问题描述】:

问题定义:

计算一组中最长的子集对,总和为 10。一旦确定了一对,这两个数字就不能用于形成其他对。输出应该是一个数字,表示此类对中涉及的数字计数。

输入:1 {1,2,8,9,1,9,1,9} 答案:6(3 对,6 个数字,索引 = {0,7},{3,6},{4, 5})

输入:2 {5,5,5,5,5,5,5,5} 答案:8(4 对,8 个数字,索引 = {0,7},{1,6},{2, 5},{3,4})

输入:3 {2,4,3,7,3,8,6,7} 答案:4(2 对,4 个数字,索引 = {0,5},{3,4} 或 {0, 5},{2,3} 或 {2,7},{3,4} 或 {1,6},{2,3} 或 {1,6},{3,4})

我写了以下代码:

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

#define ARRAYSIZE 10
#define SUM 10

int d[ARRAYSIZE][ARRAYSIZE];
int count = 0;
int final[ARRAYSIZE/2];
int reset = 0;
int subset_to_sum(int a[], int m, int n, int sum)
{
    //printf("%d %d %d \t",m,n,d[m][n]);
    if (m >= n)
        return 0;
    if (d[m][n] != -1)
        return d[m][n];

    if (a[m]+a[n] == sum)
    {
        d[m][n] = 1;
        count = count+1;
        //printf("%d\n",count);
        if (m+1>=n-1)
        {
            final[reset] = count;
            reset = reset+1;
            count = 0;
        }
        else
            final[reset] = count;
        return 1+subset_to_sum(a, m+1, n-1, sum);
    }
    else if (a[m] > sum)
        return subset_to_sum(a, m+1, n, sum);
    else if(a[n] > sum)
        return subset_to_sum(a, m, n-1, sum);
    else
        return (subset_to_sum(a, m+1, n, sum)+subset_to_sum(a, m, n-1, sum)+subset_to_sum(a, m+1, n-1, sum));       
}

int main(void)
{
    int i = 0;
    int j;
    int inc;

    //int set[] = {1,2,8,9,1,9,1,9};
    //int set[] = {1,2,8,4,5,9,1,9};
    //int set[] = {2,4,3,7,3,8,6,7};
    //int set[] = {5,5,5,5,5,5,5,5};
    //int set[] = {25,35,45,5,6,7,8,9};
    //int set[] = {1,2,3,4,5,6,7,8,9,10};

    for(i=0;i<ARRAYSIZE;i++)
    {
        for(j=0;j<ARRAYSIZE;j++)
        {
            d[i][j] = -1;
        }
    }
            printf("\n");
    //printf("Total Pairs making sum %d is : %d\n",SUM,subset_to_sum(set, 0, ARRAYSIZE-1, SUM)*2);
    subset_to_sum(set, 0, ARRAYSIZE-1, SUM);

    int max = 0;
    for(i=0;i<4;i++)
    {
        if(final[i]>max)
            max = final[i];
    }
    printf("Subset Pairs making sum %d is: %d\n",SUM,max*2);
    return 0;
}

我的代码输入失败:{1,2,3,4,5,6,7,8,9,10}。有人能指出我方法中的缺陷吗?

谢谢!

【问题讨论】:

  • 您似乎遗漏了输入 3 的两个可能答案:{(1,6),(2,3)} 和 {(1,6), (3,4)}。您能否为 {1,2,3,4,5,6,7,8,9,10} 添加错误的输出?
  • 你是对的,现在添加。对于输入 {1,2,3,4,5,6,7,8,9,10},我得到的输出为 6(3 对,6 个数字),而答案应该是 8(4 对,8 个数字) .
  • 这个问题是否需要使用动态规划?难道你不能对列表进行排序,然后从末端开始寻找加起来为十的配对吗?我认为这会容易得多。见this question
  • 这是另一个similar question
  • @JS1 我们如何满足子集属性?

标签: c dynamic-programming subset


【解决方案1】:

我稍微修改了你的代码,你可以试试下面:

int subset_to_sum(int a[], int m, int n, int sum)
{

if (m >= n)
    return 0;

if (a[m]+a[n] == sum)
  return 1+subset_to_sum(a, m+1, n, sum) + subset_to_sum(a, m, n-1, sum);
else
    return subset_to_sum(a, m+1, n, sum) + subset_to_sum(a, m, n-1, sum);       
}

【讨论】:

  • 使用您修改后的算法,我仍然得到不正确的答案。答案应该是 8,但我得到 6。
  • @user2761431 ,我简化了功能,您可以再试一次吗?我想知道这个函数与你的输入数组的返回值是什么。
  • 最新版本的值是 0。
猜你喜欢
  • 2012-06-08
  • 2019-01-14
  • 1970-01-01
  • 2011-03-29
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
相关资源
最近更新 更多