(递归法)有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。

来源:互联网 发布:网络代销 编辑:程序博客网 时间:2024/06/08 08:35
#include "stdafx.h"#include <stdio.h>#include <math.h>/*有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。例如:var a=[100,99,98,1,2, 3];var b=[1, 2, 3, 4,5,40];*//*思路:  即求sums=|sum(a)-sum(b)|的最小值;1.建立一个临时数组将数组a,b合并成一个新数组myarr[],维度为2n,并计算初始sums;2.依次从新数组myarr[]中选择n个数,填入临时数组temparr[]中,并计算累加和sum,计数标记为counts++;3.当temparr[]元素为n时,比较sum和sums,如果sum更小则保存较小值dt_sum;*/#define N 6  //数组元素个数int myarr[2*N];int sums = 0; //a b数组之和int  dt_sum = 0; //|sum(a)-sum(b)|int counts = 0;int temparr[N]; //用与记录结果//递归函数void SwapArr(int index, int sum){if (counts >= N){int temp_dt_sum = abs(sums - 2 * sum);if (temp_dt_sum < dt_sum){//输出每次比较结果printf("A=[");for (int k = 0; k < N ; k++)printf("%d ", temparr[k]);dt_sum = temp_dt_sum;printf("] |sum(a)-sum(b)|=%d\r\n", temp_dt_sum);}return;}for (int i = index; i < 2*N; i++){sum = sum + myarr[i];//求和temparr[counts] = myarr[i];//记录当前元素counts++;//元素计数SwapArr(i + 1, sum);//递归输入新数//返回到i状态temparr[counts] = 0; counts--;sum = sum - myarr[i];}}int main(){int a[] = { 100, 99, 98, 1, 2, 3 };int b[] = { 1,2, 3, 4, 5, 40 };int a_sum = 0,b_sum=0;/*统计a b数组和 数组合并为myarr[2*N]*/for (int i = 0; i < N; i++){myarr[i] = a[i];myarr[i + N] = b[i];a_sum = a_sum + a[i];b_sum = b_sum + b[i];}/*dt_sum=|sum(a)-sum(b)|*/dt_sum = abs(a_sum - b_sum);/*求数组总和*/sums = a_sum + b_sum;SwapArr(0, 0);return 0;}


阅读全文
1 0
原创粉丝点击