1

我正在使用动态问题解决。

我的C代码如下:

int balanced_partition( int arr[] , int n){

    int i,j;
    int sum=0;
    for(i=0;i<n;i++)
        sum+=arr[i];

    int p[n+1][sum+1];
    for(i=0;i<n+1;i++){
            for(j=0;j<sum+1;j++){
                    if(i==0)
                            p[0][j]= 0;
                    else if(j==0)
                            p[i][0]=1;
                    else{
                            if( (i-1>=0 && p[i-1][j]==1) ||  ( i-1>=0 && j-arr[i]>=0 && p[i-1 [j-arr[i]]==1) )
                                    p[i][j]=1;
                            else
                                    p[i][j]=0;
                            }
                    }
            }

    int min=INT_MAX;
    int half_sum=sum/2;
    for(i=half_sum;i>=0;i--)
            if(p[n][half_sum-i]==1 && min >(half_sum-i) ){
                    min = half_sum-i;
                    }
    return min;

}

但是我得到了数组 = [1,5] 的错误输出。我正在使用 参考问题 7 中给出的想法来解决

我在哪里做错了?

4

2 回答 2

2

当您尝试访问j-arr[i]时,错误结果是否定的。

在平衡分区算法中,您假设整数是非负数。所以请像这样更新您的代码:

if(arr[i] <= j)
     p[i][j] = max( p[i-1][j] , p[i-1][j-arr[i]] );
else
     p[i][j] = p[i-1][j];
于 2013-02-14T15:15:27.193 回答
0

我知道现在回答这个问题已经很晚了,但我在代码中看到的问题是由于变量i的范围为[0,n](包括 n):

代码片段:

if( (i-1>=0 && p[i-1][j]==1) ||  ( i-1>=0 && j-arr[i]>=0 && p[i-1 [j-arr[i]]==1) )

由于数组的大小是n即从0n-1 & i范围从[0,n]所以a[n] for i = n将抛出ArrayIndexOutOfBoundsException,所以你必须使用j - arr[i-1] in您的代码而不是j - arr[i]

if( (i-1>=0 && p[i-1][j]==1) ||  ( i-1>=0 && j-arr[i-1]>=0 && p[i-1 [j-arr[i-1]]==1) )
于 2014-04-13T23:48:46.737 回答