用JAVA或者C/C++实现:在3*4的二维数组中提取每一列的一个值相加,并求出相加后的最小值!

如果有要求其最小值不小于某个数呢(比如你得出来的最小值为20,但要求是得出不小于25的最小值)?

#include<iosteam>
using namespace std;
int main(){
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
int sum, min;
for(int i=0; i<4; i++){
min = a[0][i];
for(int j=0; j<3, j++){
if(a[j][i] < min) min = a[j][i];
}
sum += min;
}
return 0;
}
如果要不小于某个值,出现冲突的情况肯定是得出的数小于指定值。可以将每行升序排序。已求得的最小值肯定是每行第一个相加,如果小于指定值,逐个用第二行替换,以保证替换完增长值最小~直到超过指定值追问

按你那样算法也不是很准:如果a[3][4]={{1 2 3 5},{2 4 4 7},{3 4 5 6 }};原本算出来的最小值应该是1+2+3+5=11咯;次小值为:1+4+3+5=13;但其实次小值应该为:1+2+4+5=12来着···所以,觉得你的算法还不够缜密,不过不知道是否我的理解有误·

追答

我说的是保证增长最小,显然第二次不能把2换成4,而应该把3换成4,就像你写的那样~

追问

有点理解拉。能求个范例不?发QQ709240132 因为我想的把所有的和加起来放到Collection集合类中,再对其进行排序,得出的值和待取值进行比较。不过这样的复杂度太大,所以不适用于通用型

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-16
先将每一行按从小到大得顺序排一下序,然后将第一列的值相加就是最小值
第2个回答  2011-10-16
#include <stdio.h>
const int lowest = 10;//规定的不小于这个最小值
const int INF = 100000000;
int main()
{
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int mi = INF;
for (int j = 0; j < 4; ++j)
{
int sum = 0;
for (int i = 0; i < 3; ++i)
{
sum += a[i][j];
}
if (sum >= lowest && sum < mi) mi = sum;
}
printf("%d\n", mi);
}
第3个回答  2011-10-16
其实具体的算法挺简单的,就是先找出每一列的最小值,然后再进行相加即可;要是有要求说最小值不小于某个数,就设置条件,如果最小值大于某个值就提示该二维数组有错,或者说该二维数组不符合标准。
简单的格式如下:
#include <iostream>
using namespace std;
void main()
{
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int temp,sum,max;
sum=0;
max=25;
for(int i=0;i<4;i++)
{
temp=a[0][i];
for(int j=2;j>0;j--)
{
if(a[j][i]<temp)
temp=a[j][i];
}
sum=sum+temp;
}
if(sum>max)
cout<<"wrong array !!"<<endl;
else
cout<<sum<<endl;
}
相似回答