【发布时间】:2014-10-19 09:58:49
【问题描述】:
我遇到了一个有趣的算法,但我很难用 C 语言实现。
我确实在 C++ 中找到了它的代码,但我尝试将 C++ 代码转换为 C,但程序崩溃了。
C++ 代码如下:
int BalancedPartition ( int a[] , int n ){
int sum = 0;
for( int i = 0 ; i < n ; i++)
sum += a[i];
int *s = new int[sum+1];
s[0] = 1;
for(int i = 1 ; i < sum+1 ; i++) s[i] = 0;
int diff = INT_MAX , ans;
for(int i = 0 ; i < n ; i++)
{
for(int j = sum ; j >= a[i] ; j--)
{
s[j] = s[j] | s[j-a[i]];
if( s[j] == 1 )
{
if( diff > abs( sum/2 - j) )
{
diff = abs( sum/2 - j );
ans = j;
}
}
}
}
cout<< ans << " " << sum-ans<< endl; //two balanced partitions
return min( ans , sum-ans );
}
我的(部分)C 代码如下:
double WeightDifference(int *a, int n)
{
int sum = 0;
for (int i = 0; i < n; i++){
sum += *a[i];
}
const sizeOfS = sum + 1;
int *s[32467];
我们将不胜感激。
【问题讨论】:
-
int *s[32467];创建一个巨大的整数指针数组。你可能想要int s[32467];。 C++ 语法是因为new. -
C 和 C++ 代码中的数组行为相同,所以它只是
sum += a[i]。使用额外的*取消引用并不能满足您的要求。 -
*a[i];不需要* -
大家好,感谢您的回复,稍后代码也会崩溃。你们中的任何人都可以上传C代码吗?
-
除了通过流输出和使用
new创建数组之外,您的 C++ 代码应该与 C 代码一样好。如果你使用malloc/free组合而不是new或可变长度数组并使用printf而不是那些讨厌的<<s,你应该没问题。