动态规划失败的测试情况下

问题描述:

问题定义:动态规划失败的测试情况下

计数一组归纳到值10一旦确定一个对中的最长子集对,这些2个号码不能用于形成其他对。输出应该是一个数字,表示这些对中涉及的数字的数量。

输入: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}。有人能指出我的方法存在缺陷吗?

谢谢!

+0

你似乎已经离开了输入3两个可能的答案:{(1,6),(2,3)} ,和{(1,6),(3,4)}。你能否为{1,2,3,4,5,6,7,8,9,10}添加不正确的输出? – genisage 2014-11-06 22:08:37

+0

你是对的,现在补充。输入为{1,2,3,4,5,6,7,8,9,10}的输出为6(3对,6个数字),而答案应该是8(4对,8个数字) 。 – user2761431 2014-11-06 22:19:32

+0

您是否需要为此问题使用动态编程?难道你不能仅仅对这个列表进行排序,然后从寻找最多可以添加十个的对的两端开始工作吗?我认为这会容易很多。见[这个问题](http://stackoverflow.com/questions/4720271/find-a-pair-of-elements-from-an-array-whose-sum-equals-a-given-number)。 – JS1 2014-11-06 22:29:36

我修改你的代码一点点,你可以请尝试以下:

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);  
} 
+0

我仍然使用修改的算法得到不正确的答案。答案应该是8,但我得到6. – user2761431 2014-11-10 16:17:32

+0

@ user2761431,我简化了功能,你可以再试一次吗?我想知道什么是你的输入数组的这个函数的返回值。 – Dere0405 2014-11-10 19:34:34

+0

我使用最新版本获得值0。 – user2761431 2014-11-11 13:26:34