C++很难的题目(高手进) 编完 加100分 1000分也可以

来源:百度知道 编辑:UC知道 时间:2024/06/07 23:37:20
提示: 如果朋友不想做别说什么。

一、 编程题:
(程序有一定难度,请好好思考。下周的作业不布置了,独立把这个程序做出来。)
1)问题描述: 单背包问题
给定n个物品和一个背包。每个物品有一定的重量和价值。问如何选择装入背包中的物品,使得装入背包中物品的重量和不超过界值的情况下总价值最大?(在选择装入背包中的物品时,对于每一个物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入物品i的一部分)。
2)要求的问题规模及实现方法
实现方法总体描述:满足要求的物品装包方法很多,我们随机产生50种符合要求的装包方法,在此50种方法的基础上进行一定的选择和交叉操作,得到另外一组50种装包方法,如此循环,直到设定的循环条件不满足,此时得到的50种装包方法中价值最大的为较优的装包方法。
具体步骤:
(1) 物品个数20,每个物品的价值和重量随机生成(注意这批数据做为物品的原始数据,生成后就不要再改变),其中价值分布在10-100之间,重量分布在100-1000之间。界值为总重量的2/3。(提示:可用数组存放)
(2) 装入包的物品用1表示,未装入的用0表示,这样可以产生20位长的编码01110…0001111,若重量不超过界值,则把其称为一个个体。一个个体就是其中的一种装包方法。(提示:可定义一个名为个体(individual)的结构,成员包括个体编码,个体重量,个体价值。个体编码随机产生,也就是产生随机数0和1,组成20位长的编码)
(3) 产生50个个体,那么每个个体都有对应的重量和价值。(提示:可定义结构数组存放50个个体)
(4) 50个个体按价值进行从大到小的排列,按顺序两两配对,进行单点交叉操作。单点交叉方法为: 随机产生交叉位(注意交叉位不能在最前面和最后面),交叉位后面的数字进行交换,
交叉位
原个体1 0 1 1 1 0 0 1 1 0 1 0
原个体2 1 0 1 0 1 1 0 1 1 0 0
经过产生交叉位以后,原个体交叉位后面的数字进行互换,可以产生以下两个新的个体为:

新个体1 0 1 1 1 0 1 0 1 1

今天要睡觉了,我想了一下,应该没问题
明天给你答案,我准备用面向对象的方法
应该会有3个文件,你给我个邮箱吧,明天做好之后跟你联系

这位哥们,你留了问题就走啊,有人回答,看都不说看一眼,怎么感觉你对这个不怎么关心呢。你想要答案好歹给个邮箱什么的

自己找书看,<。)#)))≤