• 编程挑战(5)


    1: 问题的提出:
     有两个数组a,b,大小都为n, 数组元素的值任意,无序。
     要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小

    2:问题的转化
     2.1  求这2n个数据相加之和,然后再计算出和的一半。
     2.2  枚举出从2n个数字中取出n的的各种组合,分别求出每种组合的和。
     2.3  将每种组合的和与一半2.1的结果比较,相差最小即为最后结果

    其实问题最后转化为编程挑战(4),数组中元素的组合

    //数组递归求和
    int sum(int value[], int length)
    {
    	int result = 0;
    	if (length == 1)
    	{
    		result = value[0];
    	}
    	else 
    	{
    		result = value[length - 1] + sum(value, length - 1);
    	}
    	return result;
    }
    
    //合并两个数组为一个数组
    void contact(int value1[], int length1, int value2[], int length2, int value3[], int&length3)
    {
    	length3 = 0;
    	for(int i=0; i<length1; i++)
    	{
    		value3[length3++] = value1[i];
    	}
    
    	for(int i=0; i<length2; i++)
    	{
    		value3[length3++] = value2[i];
    	}	
    }
    
    //数组顺序输出
    void output(int value[], int length, int average)
    {
    	int sum  = 0;
    	for(int i=length -1 ; i>=0; i--)
    	{
    		sum = sum + value[i];
    		printf("%d ", value[i]);
    	}
    	printf("sum=%d average=%d abs(diff)=%d 
    ", sum, average, abs(sum - average));
    }
    
    //数组顺序输出
    void output(int value[], int length, int average)
    {
    	int sum  = 0;
    	for(int i=length -1 ; i>=0; i--)
    	{
    		sum = sum + value[i];
    		printf("%d ", value[i]);
    	}
    	printf("sum=%d average=%d abs(diff)=%d 
    ", sum, average, abs(sum - average));
    }
    
    //从M 个数中取 N 个数的组合,并求出每种情况的和与平均的差
    void enumkind(int value[], int M, int N, int result[], int constant, int average)
    {
    	for(int i = M; i >= N; i--)
    	{		
    		result[N - 1] = value[i - 1];
    
    		if (N  > 1)
    		{
    			enumkind(value, i - 1, N - 1, result, constant, average);
    		}
    		else
    		{
    			output(result, constant, average);
    		}
    	}
    }
    
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int value1[4] = {10,25,38,49};
    	int length1 = 4;
    
    	int value2[4] = {34,98,76,12};
    	int length2 = 4;
    
    	int value3[8];
    	int length3 = 0;
    	contact(value1, 4, value2, 4, value3, length3);
    
    
    	printf("output all kinds of 4 elements
    ");
    	int result[4];
    	int average = sum(value3, 8)/2;
    	enumkind(value3, 8, 4, result, 4, average);
    
    
    	getchar();
    	return 0;
    }
    
    


     

  • 相关阅读:
    [ZT]SAP ECC5.0 Working Log TO 2008.5.26
    VS错误:Lc.exe 已退出错误 返回代码 1
    如何实现两个数据库的同步?
    sp_configure 'max server memory'
    [轉]中国油价世界最高 是美国7倍!
    C#WinForm App自动更新(Live Update)架构
    利用批處理自動在異地備份數據庫
    18种根据屏幕字段查找潜在数据的技巧
    [ZT]2008年到校园招聘各企业待遇曝光
    吉祥物由于具有商业气息,所以历届奥运会吉祥物都没有出场。
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3186873.html
Copyright © 2020-2023  润新知