主题:[讨论]一道关于矩阵求最小和的问题
Visaya
[专家分:50] 发布于 2010-04-16 09:22:00
题目如下:
现有一个n*n的二维数组,从每一行选取一个数,这样共得到n个数,并且使这n个数属于不同的列,求出使这n个数和最小的一种取法。
哪位仁兄帮忙看一下这道题目
回复列表 (共4个回复)
沙发
Visaya [专家分:50] 发布于 2010-04-16 10:16:00
以下是初始化二维数组的方法
int **p,n;
cin>>n;
*p=new int[n];
for(int i=0;i<n;i++)
p=new int[n];
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
cin>>p[j][k];
//////////////////但是中间的方法怎么写 总不会用n个for循环和n个if语句吧
for(int r=0;r<n;r++)
delete []p[r];
delete []p;
板凳
wangzining [专家分:620] 发布于 2010-04-16 10:53:00
// 现有一个n*n的二维数组,从每一行选取一个数,这样共得到n个数,
//并且使这n个数属于不同的列,求出使这n个数和最小的一种取法
//时间:2010.4.16
#include <stdio.h>
#include <stdlib.h>
#define row 4
//次结构记录各行最小值与对应列
struct record
{
int min,r;
};
//找出各行最小值
record min(int *a)
{
record m;
m.min=a[0];
m.r=0;
for(int i=0;i<row;i++)
if(a[i]<m.min)
{
m.min=a[i];
m.r=i;
}
return m;
}
//找出大于当前值啊a【r】的第r行次小值
record elsemin(int *a,int r)
{
record m;
m.min=a[r];
m.r=r;
for(int i=0;i<row;i++)
if(a[i]>m.min)
{
m.min=a[i];
m.r=i;
break;
}
for(i=0;i<row;i++)
{
if(i==r) continue;
else if(a[i]<m.min&&a[i]>a[r])
{
m.min=a[i];
m.r=i;
}
}
return m;
}
//检验是否以符合要求
bool check(record *m)
{
for(int i=0;i<row;i++)
for(int j=i+1;j<row;j++)
if(m[i].r==m[j].r)
return false;
return true;
}
int main()
{
int a[][row]={
{5,6,4,9},
{6,4,8,1},
{3,6,9,4},
{3,5,6,9}
};
record m[sizeof(a)/sizeof(a[0])];
for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
m[i]=min(a[i]);
do
{
for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
{
for(int j=i+1;j<sizeof(a)/sizeof(a[0]);j++)
{
if(m[i].r==m[j].r)
{
if(elsemin(a[i],m[i].r).min-m[i].min
>elsemin(a[j],m[j].r).min-m[j].min)//我认为替换原则是替换最小值与次小值差小的
m[j]=elsemin(a[j],m[j].r);
else
m[i]=elsemin(a[i],m[i].r);
}
}
}
}while(!check(m));
for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
printf("%d %d\n",m[i].min,m[i].r);
}
我写了一个,抛砖引玉,请指正
3 楼
Visaya [专家分:50] 发布于 2010-04-16 13:34:00
测试了几组数据,没有问题
代码也看懂了
但是还是有些疑虑,这样能保证和是最小的吗
因为你比较的时候只是两行在比较,并没有考虑到其它行的因素
可能是我太笨了吧 不好意思啊
4 楼
mur1985 [专家分:0] 发布于 2010-04-18 10:26:00
挑出每行的最小值再相加 难道结果不是最小的???
我来回复