我正在使用动态问题解决。
我的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
我做错了什么?
答案 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) )