在闲暇之余,无意之中看中感兴趣的一道算法,当时想了好久,没想出解决方案。于是想通过网络搜索一下该题的解决方案,然而搜索了很久没有检索到。可能是我花的时间太少了吧。虽然v_JULY_v的博客http://blog.youkuaiyun.com/v_july_v/article/category/823518有涉及到,且都已经已出书的形式发布了。然而我没有去购买该书,不清楚该书有没有解决。另外,v_JULY_v是我比较钦佩的人,其算法之道可谓是扎实。
废话也说了太多了,还是回归主题吧!
题目:
有两个序列a,b,大小都为n,序列元素的值任意整数,无序; |
分析:
1. 通过交换a,b中的元素,说明a,b的元素个数一直没有变,且它们的元素个数相等。 |
思路:
1, 将其a,b序列合并一个序列c,并求出序列c的元素和sumc. 2, 从序列c中挑选n个元素组成一个序列a1,剩下的n个元素也就形成了b1序列。 那么如何挑选这n个元素,是有的标准的判断条件:就是a1序列中元素和尽可能的接近这个序列c的元素和的一半。那么就可以达到a,b序列元素和之差最小。 |
如何挑选n个元素,我想到了“装包算法”。我之所以加上索引号,是因为我不清楚装包算法的定义,所以,姑且先称它为装包算法吧。
想像一个情景,商店有12个产品a1.....a12,它们的价格分别为1、1、2、2、3、3、4、5、40、98、99、100。然而你身上只有179元((1+1+2+2+3+3+4+5+40+98+99+100)/ 2)。且商店要求你只能购买6个商品(是不是很奇葩的要求,姑且忍受吧,嘿嘿!!!)。那么你想把这钱尽可能的花完。你该如何挑选了?
如果是人的,通过几次运算就可以得出要购买的商品为a5、a6、a7、a8、a9、a12。
但是电脑不是人,是比较“笨”的机器。很多大牛都说过这句话。只有从电脑的角度想问题,才能理解电脑的奥秘。然而我们都是从人的角度出发想问题。废话多了,有点跑题了。
回归主题,电脑是如何挑选的呢?
1,将12个产品按照价格进行从小到大排序。 2,选出前面6个产品。 3,计算选出的产品价格和,并与下一个产品的价格进行”加“运算。判断运算后的价格是否小于179元。如果是小于,跳到第4步。大于,跳到第五步。等于,就跳到第6步。 4,将价格最小的商品去掉,加上刚刚挑选的商品。然后跳到第3步。 5,计算超过了多少钱,然后将超过这个价钱中的最小价格的商品给去掉,然后加上给刚挑选的商品。接着跳到第3步。 6,已经挑选出最合适的6个商品。 |
这个有个前提,每次新加上新商品,都要进行排序。
#include<stdio.h> void order(int *c,int length){ int sumres = sum(result,6); int * c = (int *) malloc(12*sizeof(int)); |