平衡分区(查找一组正整数的两个分区之间的最小化和)

时间:2013-02-14 14:58:25

标签: algorithm

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

我的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中给出的想法 Reference

我做错了什么?

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分:0)

我知道回答这个问题已经很晚了,但我在代码中可以看到的问题是由于变量 i 的范围是 [0,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 ,即从 0 n-1 &amp; 范围从 [0,n] 所以 a [n] i = n 会抛出 ArrayIndexOutOfBoundsException ,因此您必须在代码中使用 j - arr [i-1] 而不是 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) )