逻辑

时间:2016-01-04 11:47:20

标签: sum subset

这是一个用于查找具有给定总和的子集的程序。我正在使用动态编程。 虽然根据我的逻辑似乎是正确的。我没有得到正确的答案。我的代码如下。 Thanks`

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

int main()
{
int t,n,sum,**m,*a,i,j,k,temp;
scanf("%d",&t);
for(k=0;k<t;k++)
{
    scanf("%d%d",&n,&sum);
    a = (int *)malloc(n * sizeof(int));
    for(j=0;j<n;j++)
    {
        scanf("%d",&a[i]);
    }
    m = (int **)malloc((n+1) * sizeof(int *));
    for(i=0;i<n+1;i++)
    {
        m[i] = (int *)malloc((sum+1) * sizeof(int));
        m[i][0] = 1;
    }
    for(j=1;j<sum+1;j++)
    {
    m[0][j] = 0;
    }


    for(i=0;i<n+1;i++)
    {
        for(j=0;j<sum+1;j++)
        {
            printf("%d ",m[i][j]);

        }
            printf("\n");
    }
    printf("\n\n\n");

    for(i=1;i<n+1;i++)
    {
        for(j=1;j<sum+1;j++)
        {
            temp = j- a[i-1];
            if(m[i-1][j] == 1)
                m[i][j] =1;
            else
            if(temp >= 0)
                m[i][j] = m[i-1][temp];
            else 
                m[i][j] = 0;
        }
    }


    for(i=0;i<n+1;i++)
    {
        for(j=0;j<sum+1;j++)
        {
            printf("%d ",m[i][j]);

        }
        printf("\n");
    }


    if(m[n][sum] == 1)
    {
        printf("YES\n%d",m[n][sum]);
    }
    else
        printf("NO\n%d",m[n][sum]);

}
return 0;
}`

我是编程新手。任何帮助表示赞赏。

0 个答案:

没有答案