菜鸟一枚请教大虾们一个问题
本人有个问题想要请教大家。。 就是 给你一个N*N的矩阵。怎么样找出不同行不同列的N个数的和。使他最小,为了简化问题,可以实现时不用最小,但是不能超过10W。 我在思考中,想到了运筹的运输问题,用匈牙利算法。。但是对于编程,小弟愚笨,不知道该如何用C语言实现,现特求各位大虾们帮帮我,最好有具体的实现程序,然后我再去一点点的琢磨每条语句都在干什么。谢谢大仙们!!PS。我的一个同学给我个套程序,但是无法运行,大虾们可以看看这段在哪出错了,帮我修改下。。谢谢啦!!!万分感谢这里的大虾们
#include <stdio.h>
#include <time.h>
#include <conio.h>
main()
{
#define MAX 100 //随机数最大数
printf("输入n:");
srand(time(NULL));
int **k,*k2,i=0,j=0,n,max=0;//k:二维数组,k2:存储行列数和,i,j:循环数,n:行列,max:最大数
k2=(int)malloc(2*n*sizeof(int));//分配2n个空间存储各行列的和
scanf("%d",&n);//输入n
k=(int **)malloc(n*sizeof(int*));//分配n行
for(;i<n;i++){
*(k+i)=(int*)malloc(n*sizeof(int));//分配给每行n列
k2[i]=0;
k2[i+n]=0;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
*(*(k+i)+j)=rand()%(MAX+1);//分配给矩阵Max及以内的数
printf("%3d ",k[i][j]);
}
printf("\n");//每行换
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
k2[i]+=k[i][j];//横向累加
k2[i+n]+=k[j][i];//竖向累加
}
(k2[i]>k2[i+n])?(k2[i]>max?(max=k2[i]):(max=max)):((k2[i+n]>max)?(max=k2[i+n]):(max=max));//单次对比寻找最大数
}
for((i=0),(printf("横向 竖向\n"));i<n;i++)//格式化输出
printf("%-4d %-4d\n",k2[i],k2[i+n]);
//释放内存权限
free(k2);
k2=NULL;
for(i=0;i<n;i++){
free(*(k+i));
*(k+i)=NULL;
}
printf("The Max:%d",max);
getch();
}