回 帖 发 新 帖 刷新版面

主题:[讨论]一道关于矩阵求最小和的问题

题目如下:      
    现有一个n*n的二维数组,从每一行选取一个数,这样共得到n个数,并且使这n个数属于不同的列,求出使这n个数和最小的一种取法。

哪位仁兄帮忙看一下这道题目

回复列表 (共4个回复)

沙发

以下是初始化二维数组的方法
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;

板凳

//   现有一个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 楼

测试了几组数据,没有问题
代码也看懂了
但是还是有些疑虑,这样能保证和是最小的吗
因为你比较的时候只是两行在比较,并没有考虑到其它行的因素

可能是我太笨了吧 不好意思啊

4 楼

挑出每行的最小值再相加 难道结果不是最小的???

我来回复

您尚未登录,请登录后再回复。点此登录或注册