青岛科技大学算法设计与分析实验报告-算法实训-背包问题
背包问题实验报告
背包问题实验报告背包问题实验报告背包问题是计算机科学中的经典问题之一,它涉及到在给定的一组物品中选择一些物品放入背包中,以使得背包的总重量不超过其容量,并且所选择的物品具有最大的总价值。
在本次实验中,我们将通过不同的算法来解决背包问题,并对比它们的效率和准确性。
1. 实验背景和目的背包问题是一个重要的优化问题,它在许多实际应用中都有广泛的应用,比如货物装载、资源分配等。
在本次实验中,我们的目的是通过实际的算法实现,比较不同算法在解决背包问题时的性能差异,并分析其优缺点。
2. 实验方法和步骤为了解决背包问题,我们选择了以下几种常见的算法:贪心算法、动态规划算法和遗传算法。
下面将对每种算法的具体步骤进行介绍。
2.1 贪心算法贪心算法是一种简单而直观的算法,它通过每次选择当前状态下最优的解决方案来逐步构建最终解决方案。
在背包问题中,贪心算法可以按照物品的单位价值进行排序,然后依次选择单位价值最高的物品放入背包中,直到背包的容量达到上限。
2.2 动态规划算法动态规划算法是一种基于递推关系的算法,它通过将原问题分解为多个子问题,并利用子问题的解来构建原问题的解。
在背包问题中,动态规划算法可以通过构建一个二维数组来记录每个子问题的最优解,然后逐步推导出整个问题的最优解。
2.3 遗传算法遗传算法是一种模拟生物进化的算法,它通过模拟自然选择、交叉和变异等过程来搜索问题的最优解。
在背包问题中,遗传算法可以通过表示每个解决方案的染色体,然后通过选择、交叉和变异等操作来不断优化解决方案,直到找到最优解。
3. 实验结果和分析我们使用不同算法对一组测试数据进行求解,并对比它们的结果和运行时间进行分析。
下面是我们的实验结果:对于一个容量为10的背包和以下物品:物品1:重量2,价值6物品2:重量2,价值10物品3:重量3,价值12物品4:重量4,价值14物品5:重量5,价值20贪心算法的结果是选择物品4和物品5,总重量为9,总价值为34。
【优质】背包问题实验报告-范文word版 (13页)
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==背包问题实验报告篇一:背包问题实验报告课程名称:任课教师:班级:201X姓名:实验报告算法设计与分析实验名称:解0-1背包问题王锦彪专业:计算机应用技术学号:11201X 严焱心完成日期: 201X年11月一、实验目的:掌握动态规划、贪心算法、回溯法、分支限界法的原理,并能够按其原理编程实现解决0-1背包问题,以加深对上述方法的理解。
二、实验内容及要求:1.要求分别用动态规划、贪心算法、回溯法和分支限界法求解0-1背包问题;2.要求显示结果。
三、实验环境和工具:操作系统:Windows7 开发工具:Eclipse3.7.1 jdk6 开发语言:Java四、实验问题描述:0/1背包问题:现有n种物品,对1<=i<=n,第i种物品的重量为正整数Wi,价值为正整数Vi,背包能承受的最大载重量为正整数C,现要求找出这n种物品的一个子集,使得子集中物品的总重量不超过C且总价值尽量大。
动态规划算法描述:根据问题描述,可以将其转化为如下的约束条件和目标函数:nmax?vixi?n??wixi?C?i?1?x?{0,1}(1?i?n)?i寻找一个满足约束条件,并使目标函数式达到最大的解向量nX?(x1,x2,x3,......,xn)wixi,使得?i?1?C,而且?vixii?1n达到最大。
0-1背包问题具有最优子结构性质。
假设(x1,x2,x3,......,xn)是所给的问题的一个最优解,则(x2,x3,......,xn)是下面问题的一个最优解:?n??wixi?C?w1x1max?i?2?x?{0,1}(2?i?n)?i如果不是的话,设(y?vixi。
i?2nn2,y3,......,yn)是这个问题的一个最优解,则?viyi??vixi,且w1x1 i?2i?2n??wiyii?2?C。
背包问题实验报告
背包问题实验报告1. 引言背包问题是一类经典的组合优化问题,在现实生活中有着广泛的应用。
背包问题可以描述为:有一个背包容量为W的背包和N个物品,每个物品有一定的重量和价值,要求将物品放入背包中使得背包的总价值最大。
本实验旨在通过比较不同的算法策略,找到解决背包问题的最佳方法,以提高背包问题的求解效率。
2. 实验环境•操作系统:Windows 10•编程语言:Python 3.8•开发环境:Visual Studio Code3. 实验过程3.1 暴力穷举法暴力穷举法是解决背包问题的一种基本策略。
该方法通过遍历所有可能的组合,计算每个组合的价值,并找到最大价值的组合作为最优解。
具体步骤如下:1.初始化最大价值max_value为0,最优解combo为空集。
2.遍历所有可能的物品组合:–将组合中的物品放入背包中,计算背包中物品的总价值。
–若背包总价值超过max_value,则更新max_value和combo。
3.输出最优解combo和最大价值max_value。
该方法的时间复杂度为O(2^N),其中N为物品的数量,在物品数量较大时效率较低。
3.2 动态规划法动态规划法是解决背包问题的一种高效策略。
该方法通过构建价值表,利用子问题的最优解来求解背包问题的最优解。
具体步骤如下:1.初始化一个二维数组value_table,其中value_table[i][j]表示前i个物品放入容量为j的背包中的最大价值。
2.根据以下递推关系来填充value_table的值:–若第i个物品的重量大于背包容量j,则value_table[i][j]等于value_table[i-1][j],表示第i个物品不能放入背包中。
–若第i个物品的重量小于等于背包容量j,则value_table[i][j]等于max(value_table[i-1][j], value_table[i-1][j-w[i]]+v[i]),表示第i个物品可以选取并放入背包中,或不选取第i个物品。
实验报告:动态规划01背包问题)范文(最终五篇)
实验报告:动态规划01背包问题)范文(最终五篇)第一篇:实验报告:动态规划01背包问题)范文XXXX大学计算机学院实验报告计算机学院2017级软件工程专业班指导教师学号姓名2019年 10月 21日成绩课程名称算法分析与设计实验名称动态规划---0-1 背包问题①理解递归算法的概念实验目的②通过模仿0-1 背包问题,了解算法的思想③练习0-1 背包问题算法实验仪器电脑、jdk、eclipse 和器材实验:0-1 背包算法:给定N 种物品,每种物品都有对应的重量weight 和价值 value,一个容量为maxWeight 的背包,问:应该如何选择装入背包的物品,使得装入背包的物品的总价值最大。
(面对每个物品,我们只有拿或者不拿两种选择,不能选择装入物品的某一部分,也实验不能把同一个物品装入多次)代码如下所示:内 public classKnapsackProblem {容 /**、上 * @paramweight 物品重量机 * @paramvalue 物品价值调 * @parammaxweight背包最大重量试程 *@return maxvalue[i][j] 中,i 表示的是前 i 个物品数量,j 表示的是重量序 */、publicstaticint knapsack(int[]weight , int[]value , intmaxweight){程序运行结果实验内 intn =;包问题的算法思想:将前 i 个物品放入容量容为 w 的背包中的最大价值。
有如下两种情况:、①若当前物品的重量小于当前可放入的重量,便可考虑是上否要将本件物品放入背包中或者将背包中的某些物品拿出机来再将当前物品放进去;放进去前需要比较(不放这个物调品的价值)和(这个物品的价值放进去加上当前能放的总试重量减去当前物品重量时取i-1 个物品是的对应重量时候程的最高价值),如果超过之前的价值,可以直接放进去,反序之不放。
算法设计与分析实验报告—01背包问题
算法设计与分析实验报告—0/1背包问题-【问题描述】给定n 种物品和一个背包。
物品i 的重量是iw ,其价值为i v,背包容量为C 。
问应该如何选择装入背包的物品,使得装入背包中物品的总价值最大?【问题分析】0/1背包问题的可形式化描述为:给定C>0, i w >0, i v >0,1i n ≤≤,要求找出n 元0/1向量{}12(,,...,),0,1,1n i x x x x i n ∈≤≤,使得n1i i i w x c =≤∑,而且n1i ii v x=∑达到最大。
因此0/1背包问题是一个特殊的整数规划问题。
0n k w ≤≤1max ni i i v x =∑n1i ii w xc =≤∑{}0,1,1i x i n ∈≤≤【算法设计】设0/1背包问题的最优值为m( i, j ),即背包容量是j ,可选择物品为i,i+1,…,n 时0/1背包问题的最优值。
由0/1背包问题的最优子结构性质,可以建立计算m( i, j )的递归式如下:max{m( i+1, j ), m( i+1, j-i w )+i v } i j w ≥m( i, j )=m(i+1,j)n v n j w >m(n,j)=0 0n k w ≤≤【算法实现】#include <iostream.h> #include<string.h> #include<iomanip.h>int min(int w, int c) {int temp; if (w < c) temp = w;elsetemp = c;return temp;}Int max(int w, int c) {int temp; if (w > c) temp = w;elsetemp = c;return temp;}void knapsack(int v[], int w[], int** m, int c, int n) //求最优值 {int jmax = min(w[n]-1, c);for (int j = 0; j <= jmax; j++)m[n][j] = 0;for (int jj = w[n]; jj <= c; jj++)m[n][jj] = v[n];for(int i = n-1; i > 1; i--)//递归部分{jmax = min(w[i]-1, c);for(int j = 0; j <= jmax; j++)m[i][j] = m[i+1][j];for(int jj = w[i]; jj <= c; jj++)m[i][jj] = max(m[i+1][jj], m[i+1][jj-w[i]]+v[i]);}m[1][c] = m[2][c];if(c >= w[1])m[1][c] = max(m[1][c], m[2][c-w[1]]+v[1]);cout << endl << "最优值:" << m[1][c] << endl;cout<<endl;cout<< "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&" << endl;}int traceback(int x[], int w[], int** m, int c, int n) //回代,求最优解{out << endl << "得到的一组最优解如下: " << endl;for(int i = 1; i < n; i++){if(m[i][c] == m[i+1][c]) x[i] = 0;else{x[i] = 1;c -= w[i];}}x[n] = (m[n][c]) ? 1:0;for(int y = 1; y <= n; y++)cout << x[y] << "\t";cout << endl;return x[n];}void main(){int n, c;int **m;cout << "&&&&&&&&&&&&&&&&&&&&&欢迎使用0-1背包问题程序&&&&&&&&&&&&&&&&&&&" << endl;cout << "请输入物品个数: ";cin >> n ;cout << endl << "请输入背包的承重:";cin >> c;int *v = new int[n+1];cout << endl << "请输入每个物品的价值 (v[i]): " << endl;for(int i = 1; i <= n; i++)cin >> v[i];int *w = new int[n+1];cout << endl << "请输入每个物品的重量 (w[i]): " << endl;for(int j = 1; j <= n; j++)cin >> w[j];int *x = new int[n+1];m = new int* [n+1]; //动态的分配二维数组for(int p = 0; p < n+1; p++)m[p] = new int[c+1];knapsack (v, w, m, c, n);traceback(x, w, m, c, n);}【运行结果】。
背包问题实验报告
背包问题实验报告《背包问题实验报告》背包问题是一个经典的组合优化问题,它在计算机科学和运筹学领域被广泛应用。
在这个问题中,我们需要从一组物品中选择一些放入背包,使得它们的总重量不超过背包的承载能力,同时价值最大化。
在本实验中,我们将探讨不同算法在解决背包问题时的表现,并分析它们的优缺点。
首先,我们使用了贪心算法来解决背包问题。
贪心算法的基本思想是每次选择当前最有利的物品放入背包,直到背包装满或者没有物品可选。
虽然贪心算法在一些情况下能够得到较好的解,但它并不保证能够得到最优解,因为它只考虑了局部最优解而没有综合考虑所有可能的选择。
接着,我们使用了动态规划算法来解决背包问题。
动态规划算法通过将问题分解成子问题,并保存子问题的解来避免重复计算,从而得到最优解。
动态规划算法在解决背包问题时能够得到最优解,但它需要额外的空间来保存子问题的解,因此在处理大规模问题时可能会消耗较多的内存。
最后,我们使用了回溯算法来解决背包问题。
回溯算法通过不断尝试所有可能的选择,并在满足条件时继续向下搜索,直到找到解或者搜索完所有可能的选择。
回溯算法能够得到最优解,但它的时间复杂度较高,因为它需要尝试所有可能的选择。
通过实验我们发现,不同算法在解决背包问题时有各自的优缺点。
贪心算法简单快速,但不能保证得到最优解;动态规划算法能够得到最优解,但需要额外的空间;回溯算法能够得到最优解,但时间复杂度较高。
因此,在实际应用中需要根据具体情况选择合适的算法来解决背包问题。
综上所述,通过本实验我们对背包问题的解决算法有了更深入的了解,并且能够根据具体情况选择合适的算法来解决实际问题。
希望本实验能够对相关领域的研究和应用有所帮助。
回溯法、分支限界法解0-1背包问题(计算机算法设计与分析实验报告)
inti = 1;
doublebestp = 0.0;
doubleup = bound(1);
while(i !=n+ 1) {
doublewt =cw+w[i];
//检查当前扩展节点的左儿子节点
if(wt <=c) {
if(cp+p[i] > bestp) {
}
do{
System.out.println("请输入背包的容量:");
input = in.readLine().trim();
input = in.readLine().replaceAll(" ","");
}while(input.equals(""));
if(input.equals("2")){
w=newdouble[n+ 1];
for(inti = 1; i <=n; i++) {
p[i] = pp[q[i - 1].id- 1];
w[i] = ww[q[i - 1].id- 1];
}
backtrack(1);
returnbestp;
}
//回溯过程
privatevoidbacktrack(inti) {
c= cc;
n= pp.length;
Element[] q =newElement[n];
doublews = 0.0;
doubleps = 0.0;
for(inti = 0; i <n; i++) {
q[i] =newElement(i + 1, pp[i] / ww[i]);
常见算法设计实验报告(3篇)
第1篇一、实验目的通过本次实验,掌握常见算法的设计原理、实现方法以及性能分析。
通过实际编程,加深对算法的理解,提高编程能力,并学会运用算法解决实际问题。
二、实验内容本次实验选择了以下常见算法进行设计和实现:1. 排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序。
2. 查找算法:顺序查找、二分查找。
3. 图算法:深度优先搜索(DFS)、广度优先搜索(BFS)、最小生成树(Prim算法、Kruskal算法)。
4. 动态规划算法:0-1背包问题。
三、实验原理1. 排序算法:排序算法的主要目的是将一组数据按照一定的顺序排列。
常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。
2. 查找算法:查找算法用于在数据集中查找特定的元素。
常见的查找算法包括顺序查找和二分查找。
3. 图算法:图算法用于处理图结构的数据。
常见的图算法包括深度优先搜索(DFS)、广度优先搜索(BFS)、最小生成树(Prim算法、Kruskal算法)等。
4. 动态规划算法:动态规划算法是一种将复杂问题分解为子问题,通过求解子问题来求解原问题的算法。
常见的动态规划算法包括0-1背包问题。
四、实验过程1. 排序算法(1)冒泡排序:通过比较相邻元素,如果顺序错误则交换,重复此过程,直到没有需要交换的元素。
(2)选择排序:每次从剩余元素中选取最小(或最大)的元素,放到已排序序列的末尾。
(3)插入排序:将未排序的数据插入到已排序序列中适当的位置。
(4)快速排序:选择一个枢纽元素,将序列分为两部分,使左侧不大于枢纽,右侧不小于枢纽,然后递归地对两部分进行快速排序。
(5)归并排序:将序列分为两半,分别对两半进行归并排序,然后将排序好的两半合并。
(6)堆排序:将序列构建成最大堆,然后重复取出堆顶元素,并调整剩余元素,使剩余元素仍满足最大堆的性质。
2. 查找算法(1)顺序查找:从序列的第一个元素开始,依次比较,直到找到目标元素或遍历完整个序列。
动态规划方案解决算法背包问题实验报告含源代码
动态规划方案解决算法背包问题实验报告含嘿,大家好!今天我来给大家分享一个相当有趣的编程问题——背包问题。
这可是算法领域里的经典难题,也是体现动态规划思想的好例子。
我会用我10年的方案写作经验,给大家带来一份详细的实验报告,附带哦!让我简单介绍一下背包问题。
假设你是一个盗贼,要盗取一个博物馆里的宝贝。
博物馆里有n个宝贝,每个宝贝都有它的价值v和重量w。
你有一个承重为W的背包,你希望放入背包的宝贝总价值最大,但总重量不能超过背包的承重。
这个问题,就是我们要解决的背包问题。
一、算法思路1.创建一个二维数组dp,dp[i][j]表示前i个宝贝放入一个承重为j的背包中,能达到的最大价值。
2.初始化dp数组,dp[0][j]=0,因为如果没有宝贝,那么无论背包承重多少,价值都是0。
3.遍历每个宝贝,对于每个宝贝,我们有两种选择:放入背包或者不放入背包。
4.如果不放入背包,那么dp[i][j]=dp[i-1][j],即前i-1个宝贝放入一个承重为j的背包中,能达到的最大价值。
5.如果放入背包,那么dp[i][j]=dp[i-1][j-w[i]]+v[i],即前i-1个宝贝放入一个承重为j-w[i]的背包中,加上当前宝贝的价值。
6.dp[i][j]取两种情况的最大值。
二、defknapsack(W,weights,values,n):dp=[[0for_inrange(W+1)]for_inrange(n+1)]foriinrange(1,n+1):forjinrange(1,W+1):ifj>=weights[i-1]:dp[i][j]=max(dp[i-1][j],dp[i-1][j-weights[i-1]]+values[i -1])else:dp[i][j]=dp[i-1][j]returndp[n][W]测试数据W=10weights=[2,3,4,5]values=[3,4,5,6]n=len(values)输出结果max_value=knapsack(W,weights,values,n)print("最大价值为:",max_value)三、实验结果分析通过上面的代码,我们可以得到最大价值为15。
背包实验报告
背包实验报告背包实验报告背包实验是一种常见的心理学实验,旨在探究人类决策过程中的权衡和选择。
通过模拟背包装物的选择过程,可以揭示人们在面临多个选择时的思考方式和决策策略。
本篇文章将介绍我参与的一次背包实验,并从实验设计、结果分析以及个人感悟等方面进行论述。
实验设计在这次背包实验中,我作为实验参与者,需要在一定的时间内,从给定的物品中选择装入背包的物品,以使得背包的总价值最大化。
实验开始前,我被告知背包的容量和每个物品的重量、价值等信息。
实验过程中,我需要根据这些信息,做出自己的选择。
结果分析在实验过程中,我遇到了一些困难和挑战。
首先,我需要面对的是物品的重量和价值之间的权衡。
有些物品虽然重量较轻,但价值较低;而有些物品虽然重量较重,但价值较高。
在选择过程中,我需要综合考虑这两个因素,以找到最佳的选择策略。
其次,时间限制也给实验增加了一定的难度。
在有限的时间内,我需要尽可能多地选择高价值的物品装入背包,但同时也不能忽视物品的重量。
这就需要我在有限的时间内做出快速而准确的决策。
最后,实验中还存在一定的不确定性。
由于每个人的选择可能不同,所以在实验结果的比较上也存在一定的主观性。
同时,实验中的物品组合也可能对结果产生影响。
因此,实验的结果并不是绝对准确的,而是一种相对的比较。
个人感悟通过参与这次背包实验,我深刻体会到了决策过程中的权衡和选择的困难。
在现实生活中,我们也经常面临类似的情况,需要在多个选择之间做出决策。
而这次实验则为我提供了一个模拟的环境,让我能够更好地理解和应对这种情况。
另外,这次实验还让我认识到了时间的重要性。
在有限的时间内做出决策,需要我保持冷静、快速并且准确。
只有在时间的压力下,我才能真正体会到自己的决策能力和心理素质。
最后,这次实验也让我认识到了决策的不确定性。
在现实生活中,我们所做的决策也往往受到各种因素的影响,结果也不一定完全符合我们的期望。
因此,我们需要对结果保持一定的开放和接受,同时也要学会从失败中汲取经验,不断改进和调整自己的决策策略。
01背包问题的回溯法求解实验报告
七、附录
参考资料: 《算法导论》
} if( cw + w[i] <= c){ x[i] = 1; cw += w[i]; cp += p[i]; Backtrack(i+1); cw -= w[i]; cp -= p[i]; } if( Bound(i+1)> bestp) x[i] = 0; Backtrack(i+1); } template<class Typew, class Typep> Typep Knap<Typew, Typep>:: Bound( int i) { //计算上界 Typew cleft = c-cw; //剩余容量 Typep b = cp; //以物品单位重量价值递减序装入物品 while ( i<= n && w[i]<= cleft) { cleft -= w[i]; b += p[i]; i++; } //装满背包 if( i<=n ) b+= p[i]/w[i]*cleft; return b; } 算法复杂度:由于计算上界函数 Bound 需要 O(n)时间,在最坏情况下有 O(2n)个右儿 子结点需要计算上界函数, 故解 0-1 背包问题的回溯算法 Backtrack 所需的计算时间为 O(n2n)。 算法创新:增加了对于上限的处理函数,计算右子树中解的上界时,将剩余物品依其 单位重量价值排序,然后依次装入物品,直至装不下时,再装入该物品的一部分而装 满背包,由此得到的价值是右子树的上界,如果这个上界不能达到当前得到的最优值, 则不搜索该子树。 (2) 你在调试过程中发现了怎样的问题?又做了怎样的改进? 答:在调试过程中,对于背包中物品顺序的保存始终存在问题,应该是 1011,可是总 是无法得出正确的结果,所以,我对数组 x[i]进行了单步调试,继而发现了在前面回溯 法的设计过程中存在缺陷,将 x[4]误当成了 x[0],后来经过改正输出正确。
背包问题 启发算法
背包问题启发算法
背包问题是一种常见的优化问题,通常用于解决资源分配、决策制定等方面的问题。
启发式算法是一种常用的求解背包问题的策略,其基本思想是通过经验或直观来构造一个可行的解决方案,然后不断迭代优化这个方案,直到满足终止条件。
以下是一个简单的0-1背包问题的启发式算法:
1. 初始化:选择一个初始解,通常是一个空解或者随机解。
2. 迭代优化:在每次迭代中,尝试对当前解进行改进。
具体步骤如下:
a. 对于每个物品,计算将其添加到背包中的收益,即物品的重量与价值的乘积。
b. 选取收益最大的物品,将其添加到背包中。
c. 重复步骤b,直到背包满载或者没有剩余的物品。
3. 终止条件:当达到指定的迭代次数或者背包价值达到最大值时,停止迭代。
4. 输出结果:返回最终的背包解。
需要注意的是,启发式算法只能得到近似最优解,而不是最优解。
因此,在某些情况下,启发式算法可能无法得到最优解,但对于许多实际问题,启发式算法可以提供足够好的解决方案,并且计算效率较高。
实验报告-分支限界法01背包
《算法设计与分析》实验报告六学号: 1004091130 姓名:金玉琦日期: 2011-11-17 得分:一、实验内容:运用分支限界法解决0-1背包问题。
二、所用算法的基本思想及复杂度分析:分支限界法分支限界法按广度优先策略遍历问题的解空间树, 在遍历过程中, 对已经处理的每一个结点根据限界函数估算目标函数的可能取值, 从中选取使目标函数取得极值的结点优先进行广度优先搜索, 从而不断调整搜索方向, 尽快找到问题的解。
因为限界函数常常是基于问题的目标函数而确定的, 所以, 分支限界法适用于求解最优化问题。
0-1背包问题1)基本思想给定n 种物品和一个容量为C 的背包, 物品i 的重量是W i, 其价值为V i, 0/ 1 背包问题是如何选择装入背包的物品(物品不可分割) , 使得装入背包中物品的总价值最大,一般情况下, 解空间树中第i 层的每个结点, 都代表了对物品1~i 做出的某种特定选择, 这个特定选择由从根结点到该结点的路径唯一确定: 左分支表示装入物品, 右分支表示不装入物品。
对于第i 层的某个结点, 假设背包中已装入物品的重量是w, 获得的价值是v, 计算该结点的目标函数上界的一个简单方法是把已经装入背包中的物品取得的价值v, 加上背包剩余容量W - w 与剩下物品的最大单位重量价值vi + 1/ wi + 1的积,于是,得到限界函数:u b = v + ( W - w) × ( vi + 1/ wi + 1 )根据限界函数确定目标函数的界[ down , up],然后, 按照广度优先策略遍历问题的空间树。
2)复杂度分析时间复杂度是O(2n);三、源程序及注释:#include<iostream>#include<cstdio>#include<conio.h>#include<iomanip>using namespace std;int *x;struct node{//结点表结点数据结构node *parent,//父结点指针*next; //后继结点指针int level,//结点的层bag,//节点的解cw,//当前背包装载量cp;//当前背包价值float ub; //结点的上界值};class Knap{private:struct node *front, //队列队首*bestp,*first; //解结点、根结点int *p,*w,n,c,*M;//背包价值、重量、物品数、背包容量、记录大小顺序关系long lbestp;//背包容量最优解public:void Sort();Knap(int *pp,int *ww,int cc,int nn);~Knap();float Bound(int i,int cw,int cp);//计算上界限node *nnoder(node *pa,int ba,float uub);//生成一个结点 ba=1生成左节点 ba=0生成右节点void addnode(node *nod);//将结点添加到队列中void deletenode(node *nod);//将结点队列中删除struct node *nextnode(); //取下一个void display(); //输出结果void solvebag(); //背包问题求解};Knap::Knap(int *pp,int *ww,int cc,int nn){int i;n=nn;c=cc;p=new int[n];w=new int[n];M=new int[n];for(i=0;i<n;i++){p[i]=pp[i];w[i]=ww[i];M[i]=i;}front=new node[1];front->next=NULL;lbestp=0;bestp=new node[1];bestp=NULL;Sort();}Knap::~Knap(){delete []first;delete []front;delete []bestp;delete []p;delete []w;}float Knap::Bound(int i,int cw,int cp){// 计算上界int cleft=c-cw;float b=(float)cp;while (i<n&&w[i]<=cleft){cleft-=w[i];b+=p[i];i++;}if (i<n) b+=1.0*p[i]/w[i]*cleft;return b;}node * Knap::nnoder(struct node *pa,int ba,float uub) {//生成一个新结点node * nodell=new(node);nodell->parent=pa;nodell->next=NULL;nodell->level=(pa->level)+1;nodell->bag=ba;nodell->ub=uub;if(ba==1){nodell->cw=pa->cw+w[pa->level];nodell->cp=pa->cp+p[pa->level] ;}else{nodell->cw=pa->cw;nodell->cp=pa->cp;}return(nodell);}void Knap::addnode(node *no){//将结点加入优先队列node *p=front->next,*next1=front;float ub=no->ub;while(p!=NULL){if(p->ub<ub){no->next=p;next1->next=no;break;}next1=p;p=p->next;}if(p==NULL){next1->next=no;}}node *Knap::nextnode(){//取上限最大结点node *p=front->next;front->next=p->next;return(p);}void Knap::Sort(){int i,j,k,kkl;float minl;for(i=1;i<n;i++){minl=1.0*p[i]/w[i];k=0;for(j=1;j<=n-i;j++){if(minl<1.0*p[j]/w[j]){minl=1.0*p[j]/w[j];swap(p[k],p[j]);swap(w[k],w[j]);swap(M[k],M[j]);k=j;}}}}void Knap::display(){int i;cout<<"最大价值是:"<<lbestp<<endl;for(i=n;i>=1;i--){x[M[i-1]]=bestp->bag;bestp=bestp->parent;}cout<<"变量值为:"<<endl;for(i=1;i<=n;i++)cout<<"x("<<setw(2)<<i<<")="<<x[i-1]<<endl;}void Knap::solvebag(){//背包问题求解int i;float ubb;node *aa;first=new node[1]; //根结点first->parent=NULL;first->next=NULL;first->level=0;first->cw=0;first->cp=0;first->bag=0;ubb=Bound(0,0,0);first->ub=ubb;front->next=first;while(front->next!=NULL){aa=nextnode();i=aa->level;if(i==n-1){if(aa->cw+w[i]<=c&&(long)(aa->cp+p[i])>lbestp){lbestp=aa->cp+p[i];bestp=nnoder(aa,1,(float)lbestp);}if((long)(aa->cp)>lbestp){lbestp=aa->cp;bestp=nnoder(aa,0,(float)lbestp);}}if(i<n-1){if(aa->cw+w[i]<=c&&Bound(i+1,aa->cw+w[i],aa->cp+p[i])>(float)lbestp){ubb=Bound(i,aa->cw+w[i],aa->cp+p[i]);addnode(nnoder(aa,1,ubb));}ubb=ubb=Bound(i,aa->cw,aa->cp);if(ubb>lbestp)addnode(nnoder(aa,0,ubb));}}display();}void main(){int c,n;int i=0;int *p;int *w;cout<<"请输入背包容量:"<<endl;cin>>c;cout<<"请输入物品数:"<<endl;cin>>n;x=new int[n];p=new int[n];w=new int[n];cout<<"请输入"<<n<<"个物品的重量:"<<endl;for(i=0;i<n;i++)cin>>w[i];cout<<"请输入"<<n<<"个物品价值:"<<endl;for(i=0;i<n;i++)cin>>p[i];x=new int[n];Knap knbag(p,w,c,n);knbag.solvebag();getch();return;}四、运行输出结果:五、调试和运行程序过程中产生的问题、采取的措施及获得的相关经验教训:解决该问题首先要确定一个合适的限界函数数, 并根据限界函数确定目标函数的界[down,up],然后按照广度优先策略遍历问题的解空间树,在分支结点上,依次搜索该结点的所有孩子结点,分别估算这些孩子结点的目标函数的可能取值,如果某孩子结点的目标函数可能取得的值超出目标函数的界, 则将其丢弃, 因为从这个结点生成的解不会比目前已经得到的解更好; 否则, 将其加入待处理结点表中。
贪心算法实现背包问题算法设计与分析实验报告
算法设计与分析实验报告实验名称贪心算法实现背包问题评分实验日期年月日指导教师姓名专业班级学号一.实验要求1. 优化问题有n个输入,而它的解就由这n个输入满足某些事先给定的约束条件的某个子集组成,而把满足约束条件的子集称为该问题的可行解。
可行解一般来说是不唯一的。
那些使目标函数取极值(极大或极小)的可行解,称为最优解。
2.贪心法求优化问题算法思想:在贪心算法中采用逐步构造最优解的方法。
在每个阶段,都作出一个看上去最优的决策(在一定的标准下)。
决策一旦作出,就不可再更改。
作出贪心决策的依据称为贪心准则(greedy criterion)。
3.一般方法1)根据题意,选取一种量度标准。
2)按这种量度标准对这n个输入排序3)依次选择输入量加入部分解中。
如果当前这个输入量的加入,不满足约束条件,则不把此输入加到这部分解中。
procedure GREEDY(A,n) /*贪心法一般控制流程*///A(1:n)包含n个输入//solutions←φ //将解向量solution初始化为空/for i←1 to n dox←SELECT(A)if FEASIBLE(solution,x)then solutions←UNION(solution,x)endifrepeatreturn(solution)end GREEDY4. 实现典型的贪心算法的编程与上机实验,验证算法的时间复杂性函数。
二.实验内容1. 编程实现背包问题贪心算法。
通过具体算法理解如何通过局部最优实现全局最优,并验证算法的时间复杂性。
2.输入5个的图的邻接矩阵,程序加入统计prim算法访问图的节点数和边数的语句。
3.将统计数与复杂性函数所计算比较次数比较,用表格列出比较结果,给出文字分析。
三.程序算法1.背包问题的贪心算法procedure KNAPSACK(P,W,M,X,n)//P(1:n)和W(1;n)分别含有按P(i)/W(i)≥P(i+1)/W(i+1)排序的n件物品的效益值和重量。
背包问题问题实验报告(3篇)
第1篇一、实验目的1. 理解背包问题的基本概念和分类。
2. 掌握不同背包问题的解决算法,如0-1背包问题、完全背包问题、多重背包问题等。
3. 分析背包问题的复杂度,比较不同算法的效率。
4. 通过实验验证算法的正确性和实用性。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 开发工具:PyCharm4. 实验数据:随机生成的背包物品数据三、实验内容1. 0-1背包问题(1)问题描述:给定n个物品,每个物品的重量为w[i],价值为v[i],背包的容量为C。
求将哪些物品装入背包,使得背包内物品的总价值最大。
(2)解决算法:动态规划法(3)实验步骤:a. 初始化一个二维数组dp[n+1][C+1],其中dp[i][j]表示前i个物品在容量为j 的背包中的最大价值。
b. 遍历每个物品,对于每个容量,根据物品的重量和价值计算dp值。
c. 返回dp[n][C],即为最大价值。
2. 完全背包问题(1)问题描述:给定n个物品,每个物品的重量为w[i],价值为v[i],背包的容量为C。
求将哪些物品装入背包,使得背包内物品的总价值最大,且每个物品可以重复取。
(2)解决算法:动态规划法(3)实验步骤:a. 初始化一个一维数组dp[C+1],其中dp[j]表示容量为j的背包的最大价值。
b. 遍历每个物品,对于每个容量,根据物品的重量和价值更新dp值。
c. 返回dp[C],即为最大价值。
3. 多重背包问题(1)问题描述:给定n个物品,每个物品的重量为w[i],价值为v[i],背包的容量为C。
每个物品有无限个,求将哪些物品装入背包,使得背包内物品的总价值最大。
(2)解决算法:动态规划法(3)实验步骤:a. 初始化一个一维数组dp[C+1],其中dp[j]表示容量为j的背包的最大价值。
b. 遍历每个物品,对于每个容量,根据物品的重量和价值更新dp值。
c. 返回dp[C],即为最大价值。
四、实验结果与分析1. 0-1背包问题实验结果显示,在背包容量为100时,最大价值为298。
背包问题实验报告
一、实验背景背包问题是组合优化领域中经典的NP难问题,具有广泛的应用背景。
背包问题是指在一个背包的容量限制下,如何从一组物品中选择一部分物品,使得所选物品的总价值最大。
背包问题分为0-1背包问题、完全背包问题、多重背包问题等。
本实验旨在比较不同背包问题的算法性能,为实际应用提供参考。
二、实验目的1. 比较不同背包问题的算法性能;2. 分析不同算法的时间复杂度和空间复杂度;3. 为实际应用选择合适的背包问题算法。
三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 数据集:随机生成的背包问题数据集四、实验方法1. 实验数据:生成不同规模的背包问题数据集,包括物品数量、背包容量和物品价值;2. 算法:比较以下背包问题的算法性能:(1)0-1背包问题的动态规划算法;(2)完全背包问题的动态规划算法;(3)多重背包问题的动态规划算法;3. 性能指标:计算每个算法的运行时间、空间复杂度和最优解价值。
五、实验结果与分析1. 0-1背包问题(1)动态规划算法算法实现:根据0-1背包问题的状态转移方程,实现动态规划算法。
运行时间:随背包容量和物品数量的增加,运行时间呈指数增长。
空间复杂度:O(n×C),其中n为物品数量,C为背包容量。
最优解价值:根据动态规划算法,得到最优解价值为198。
(2)回溯法算法实现:根据0-1背包问题的状态转移方程,实现回溯法。
运行时间:随背包容量和物品数量的增加,运行时间呈指数增长。
空间复杂度:O(n×C),其中n为物品数量,C为背包容量。
最优解价值:根据回溯法,得到最优解价值为198。
2. 完全背包问题(1)动态规划算法算法实现:根据完全背包问题的状态转移方程,实现动态规划算法。
运行时间:随背包容量和物品数量的增加,运行时间呈线性增长。
空间复杂度:O(n×C),其中n为物品数量,C为背包容量。
最优解价值:根据动态规划算法,得到最优解价值为300。
背包问题(1)
背包问题报告小组成员:张灿、吴雪涛、高坤、占强、习慧平小组分工情况小组成员查找资料制作ppt 编写程序讲解ppt 制作报告张灿ⅴⅴⅴⅴⅴ吴雪涛ⅴ高坤ⅴⅴ占强ⅴ习慧平ⅴ背包问题一、背包问题的历史由来它是在1978年由Merkel和Hellman提出的。
它的主要思路是假定某人拥有大量物品,重量各不同。
此人通过秘密地选择一部分物品并将它们放到背包中来加密消息。
背包中的物品中重量是公开的,所有可能的物品也是公开的,但背包中的物品是保密的。
附加一定的限制条件,给出重量,而要列出可能的物品,在计算上是不可实现的。
背包问题是熟知的不可计算问题,背包体制以其加密,解密速度快而其人注目。
在解决大量的复杂组合优化问题时,它常常作为一个子问题出现,从实际的观点看,许多问题可以用背包问题来描述,如装箱问题,货仓装载,预算控制,存储分配,项目选择决策等,都是典型的应用例子。
随着网络技术的不断发展,背包公钥密码在电子商务中的公钥设计中也起着重要的作用。
然而当问题的规模较大时,得到最优解是极其困难的。
但是,大多数一次背包体制均被破译了,因此现在很少有人使用它。
二、背包问题的描述背包问题(Knapsack problem)是一种组合优化的NP完全问题。
问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
问题的名称来源于如何选择最合适的物品放置于给定背包中。
相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。
也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V?三、背包问题的定义我们有n种物品,物品j的重量为w j,价格为p j。
我们假定所有物品的重量和价格都是非负的。
背包所能承受的最大重量为W。
如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题。
可以用公式表示为:maximizesubject to如果限定物品j最多只能选择b j个,则问题称为有界背包问题。
实验报告动态规划背包问题
实验报告动态规划背包问题
XXXX⼤学计算机学院实验报告
计算机学院 2017 级软件⼯程专业 5 班指导教师学号姓名 2019年 10 ⽉ 21 ⽇成绩
上机调试程序、程
序运⾏结果
实
int n = ;包问题的算法思想:将前i个物品放⼊容量为w的背包中的最⼤价值。
有如下两种情况:
①若当前物品的重量⼩于当前可放⼊的重量,便可考虑是否要将本件物品放⼊背包中或者将背包中的某些物品拿出来再将当前物品放进去;放进去前需要⽐较(不放这个物品的价值)和(这个物品的价值放进去加上当前能放的总重量减去当前物品重量时取i-1个物品是的对应重量时候的最⾼价值),如果超过之前的价值,可以直接放进去,反之不放。
②若当前物品的重量⼤于当前可放⼊的重量,则不放⼊
背包问题利⽤动态规划的思路可以这样理解:阶段是“物品的件数”,状态就是“背包剩下的容量”,f[i,v]表⽰设从前i件物品中选择放⼊容量为V的背包的最⼤价值。
那么状态转移的⽅法为:
f[i][v]=max{f[i-1][v],f[i-1][v-w[i]]+c[i]}
这个⽅程可以理解为:只考虑⼦问题“将前i个物品放⼊容量为v的背包中的最⼤价值”那么可以考虑不放⼊i,最⼤价值就和i⽆关,就是f[i-1][v],如果放⼊第i个物品,价值就是
f[i-1][v-w[i]]+value[i],只取最⼤值即可。
算法分析与设计实验报告-最大子段和、0-1背包问题
实验报告课程计算机算法设计与分析实验名称最大子段和、0-1背包问题学号姓名实验日期:实验二最大子段和、0-1背包问题一.实验目的(1)学习最大子段和问题的简单算法,掌握原理,运用C++编程实现。
(2)学习0-1背包问题的简单算法,掌握原理,运用C++编程实现。
二.实验内容(1)设计最大子段和问题的算法,上机编程实现。
(2)设计0-1背包问题的算法,上机编程实现。
三.实验代码1 .分治法实现最大子段和程序如下:#include<iostream.h>int MaxSum(int a[],int left,int right){int sum=0;if (left==right){if (a[left]>0)sum=a[left];elsesum=0;}else{int center=(left+right)/2;int leftsum=MaxSum(a,left,center);int rightsum=MaxSum(a,center+1,right);int s1=0;int lefts=0;for(int i=center;i>=left;i--){lefts+=a[i];if(lefts>s1)s1=lefts;}int s2=0;int rights=0;for(int j=center+1;j<=right;j++){rights+=a[j];if(rights>s2)s2=rights;}sum=s1+s2;if(sum<leftsum)sum=leftsum;if(sum<rightsum)sum=rightsum;}return sum;}void main(){int n,a[100],m,maxsum;cout<<"分治法求解"<<endl;cout<<"请输入待求的元素数目"<<endl;cin>>n;cout<<"请输入各元素"<<endl;for(m=1;m<=n;m++)cin>>a[m];maxsum=MaxSum(a,1,n);cout<<"当前序列最大子段和为:"<<maxsum<<endl; }(2)0-1背包问题程序如下:#include<iostream>#include<cstdio>#include<conio.h>#include<iomanip>using namespace std;template<class ty>class Knap{ public:friend void Init();friend void Knapsack();friend void Backtrack(int i);friend float Bound(int i);bool operator<(Knap<ty> a)const{ if(fl<a.fl)return true;elsereturn false; }private:ty w; //重量ty v; //价值float fl; //单位重量的价值v/wint kk; //记录第几个物品int flag; //记录是否放入包中};template<class ty>void Sort(Knap<ty> *li,int n){ int i,j,k;Knap<ty> minl;for(i=1;i<n;i++){ minl=li[0];k=0;for(j=1;j<=n-i;j++){ if(minl<li[j]){ minl=li[j];swap(li[j],li[k]);k=j; } } } }namespace jie //命名空间{ int c=0,n=0;int *x=NULL;Knap<int> *bag=NULL;int cp=0,cw=0; int bestp=0; }using namespace jie;void Init(){ int i=0;cout<<endl;cout<<"请输入物品数量n = ";cin>>n;cout<<endl;cout<<"请输入背包容量C = ";cin>>c;cout<<endl;bag=new Knap<int> [n];x=new int[n];cout<<"请依次输入"<<n<<"个物品的重量W:"<<endl; for(i=0;i<n;i++)cin>>bag[i].w;cout<<endl;cout<<"请依次输入"<<n<<"个物品的价值P:"<<endl; for(i=0;i<n;i++)cin>>bag[i].v;for(i=0;i<n;i++){ bag[i].flag=0;bag[i].kk=i;bag[i].fl=1.0*bag[i].v/bag[i].w;}}void Backtrack(int i) { if(i>=n) //到达叶节点{ bestp=cp; //更新最优价值return; }if(cw+bag[i].w<=c) //进入左子树{ bag[i].flag=1;cw+=bag[i].w;cp+=bag[i].v;Backtrack(i+1);cw-=bag[i].w;cp-=bag[i].v; }if(Bound(i+1)>bestp)//进入右子树{ bag[i].flag=0;Backtrack(i+1); } } //计算当前节点处的上界float Bound(int i){ int cleft = c-cw; //剩余容量float b = cp;while (i<n&&bag[i].w<=cleft){ //以物品单位重量价值递减序装入cleft-=bag[i].w;b+=bag[i].v;i++; } //装满背包if (i<n) b+=1.0*bag[i].v/bag[i].w * cleft;return b; }void Knapsack() //计算最优解和变量值{ int L(0); //用L累计价值,初始价值设置为0for(int k=0;k<n;k++){ x[bag[k].kk]=bag[k].flag; //x=0表示未放入背包,x=1表示放入背包L+=bag[k].flag*bag[k].v; //价值累加}cout<<endl;cout<<"当前最优价值为:"<<L<<endl;cout<<"变量值x = ";for(int i=1;i<=n;i++){ cout<<x[i-1]; }delete []bag;bag=NULL;delete []x;x=NULL;cout<<endl;getch(); }int main(){ cout<<endl;cout<<"|**********回溯法解0-1背包问题**********|"<<endl;Init();Backtrack(0);Knapsack();return 0;}四.实验结果(1)分治法最大子段和问题运行结果如下:(2)0-1背包问题运行结果如下:五.总结与思考。
算法背包问题(课堂参考)
实验题目:背包问题实验目的:掌握动态规划、贪心算法的原理,并能够按其原理编程实现解决背包问题,以加深对上述方法的理解。
实验内容:一个旅行者准备随身携带一个背包. 可以放入背包的物品有n 种, 每种物品的重量和价值分别为 wj , vj . 如果背包的最大重量限制是 b, 怎样选择放入背包的物品以使得背包 的价值最大?目标函数:约束条件:线性规划问题 由线性条件约束的线性函数取最大或最小的问题整数规划问题 线性规划问题的变量 xj 都是非负整数Fk(y):装前 k 种物品, 总重不超过 y, 背包的最大价值i(k,y):装前 k 种物品, 总重不超过 y, 背包达最大价值时装入物品的最大标号递推方程、边界条件、标记函数实例计算:v1 = 1, v2 = 3, v3 = 5, v4 = 9, w1 = 2, w2 = 3, w3 = 4, w4 = 7,b = 10Fk(y) 的计算表如下:K/y 1 2 3 4 5 6 7 8 9 101 0 1 12 23 34 4 52 0 13 34 6 6 7 9 93 0 1 3 5 5 6 8 10 10 114 0 1 35 56 9 10 10 12实验步骤: 1、分析题目;N ,max 11∈≤∑∑==j n j j j n j j j x b x wx v 0)()(0,0)0(,0,0)(})(),(max{)(11101<-∞=⎥⎦⎥⎢⎣⎢=≤≤=≤≤=+-=-y y F v w y y F n k F b y y F v w y F y F y F k k k k k k k2、打开NetBeans软件,新建一个名叫 Knapsackdxj的项目,并对其进行保存;3在新建的项目下对我们所分析的题目进行编写;4、调试所编写的程序;5、运行文件,并对其进行测试,看是否正确。
实验结果:实验小结:在做本次实验之前,自己对动态规划、贪心算法的原理不是非常的理解,花了很多时间看了课本上的相关内容。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构与算法分析2 课程设计报告书班级学号姓名指导教师庞志永课程设计项目名称:背包问题的多项式时间近似方案1.问题描述:背包问题可描述为如下的整数规划形式,其中M 为背包的容量,P 为物体的价值,W 为物体的体积。
2.基本要求:(1)在给定参数K 的条件下,设计背包问题的满足近似性能比不大于1+1/(k+1)的多项式时间近似方案,并选择适当的编程语言在计算机上实现。
(2)程序能够正常运行,计算结果正确,满足设计要求。
3.算法描述:将装入背包的物体进行多次尝试,其方法是:取K 为确定的非负整数,考虑背包问题的实例I 中的n 个物体的合的K 元素子集C ,|C|=K 。
(1)尝试将每个K 元素子集C 中的物体优先装入背包;(2)利用解答背包问题的贪心算法A 将(n-K)个物体尝试装入背包。
合并先装入的K 个物体和用算法A 装入的剩余物体作为算法的最终解。
过程如下:Procedure ε-APPROX(P,W,M,n,K)(1) P MAX =0;(2) For all combinations C of size=K & weight≤M do(3) P C =∑i∈C P i(4) P MAX =max{P MAX ,P C + L(I, P, W, M, n)};(5) End for(6) End ε-APPROXProcedure L(I,P,W,M,n)(1) S 1=0; T=M - ∑i∈C W i ;(2) For i=1 to n do(3) If i ∉C and W i ≤T then(4) S 1=S 1+P i , T=T – W i(5) End if(6) End for11max {0,1},1n i i i i n i i i Px x i n W x M==⎧⎪∈≤≤⎨≤⎪⎩∑∑(7) S=max{S1,max{P i| i ∉C}};(8) Return (S)(9) End L4.模块划分(仅供参考):(1)输入及存储原始数据模块(2)ε-APPROX(P,W,M,n,K)模块(3)L(I,P,W,M,n)模块(4)存储及输出结果模块5.本课程设计中遇到的关键问题及其解决方法:背包使用面向对象方法:package knapsack;public class Knapsack {/** 背包重量 */private int weight;/** 背包物品价值 */private int value;/**** 构造器*/public Knapsack(int weight, int value) {this.value = value;this.weight = weight;}public int getWeight() {return weight;}public int getValue() {return value;}public String toString() {return"[weight: "+ weight+ "\t"+ "value: "+ value + "]";}}获取最优解:package knapsack;import java.util.ArrayList;import java.util.List;import javax.swing.JOptionPane;import algorithm.dynamicplan.Knapsack;/*** 背包* 首先将最多 k件物品放人背包,* 如果这k件物品重量大于 c,则放弃它。
* 否则,剩余的重量用来考虑将剩余物品按价值重量比递减的顺序装入。
* 通过考虑最多为 k件物品的所有可能的子集来得到最优解。
** @author**/public class KSMethod {/*** 输入及存储原始数据模块* @param n* @return P*/static List<Knapsack> InputData(int n){String weight = JOptionPane.showInputDialog("Input W(空格隔开):");String value = JOptionPane.showInputDialog("Input P(空格隔开):");String[] values = value.split(" ");String[] weights = weight.split(" ");List<Knapsack> P = new ArrayList<Knapsack>();for (int i = 0; i < n; i++) {P.add(new Knapsack(Integer.valueOf(weights[i]), Integer.valueOf(values[i])));}System.out.println("原始数据:");printlist(P);return P;}/*** e-APPROX(P,W,M,n,K)模块** @param bags1* @param M* @param n* @param K* @return 解*/static int Solve(Knapsack[] bags1, int M, int n, int K) {List<List<Knapsack>> allSubLists = getSubLists(bags1);List<Knapsack> P = new ArrayList<Knapsack>();for (Knapsack knapsack : bags1) {P.add(knapsack);}int Pmax = 0;for (List<Knapsack> I : allSubLists) {int weight = 0;for (Knapsack knapsack : I) {weight = weight + knapsack.getWeight();}if ((I.size() <= K) && weight <= M) {int Pi = 0;for (Knapsack knapsack : P) {// i++;if (I.contains(knapsack)) {Pi = Pi + knapsack.getValue();}}Pmax = max(Pmax, Pi + L(I, P, M, n));}}// end forreturn Pmax;}/*** L(I,P,W,M,n)模块** @param I* @param P* @param M* @param n* @return*/static int L(List<Knapsack> I, List<Knapsack> P, int M, int n) {int S = 0, S1 = 0;int SumWi = 0;for (Knapsack knapsack : I) {SumWi = SumWi + knapsack.getWeight();}int T = M - SumWi;for (Knapsack knapsack : P) {int Wi = knapsack.getWeight();int Pi = knapsack.getValue();if ((!I.contains(knapsack)) && Wi <= T) {S1 = S1 + Pi;T = T - Wi;}}int[] t = max(P, I);if (t[1] + SumWi < M) {S = max(S1, t[0]);}return S;}/*** 遍历集合** @param list*/static void printlist(List<Knapsack> list) { for (Knapsack knapsack : list) {System.out.println(knapsack);}}/*** 最大值** @param a* @param b* @return max*/static int max(int a, int b) {return a > b ? a : b;}/*** 计算max{Pi|i不属于I}** @param P* @param I* @return max*/static int[] max(List<Knapsack> P, List<Knapsack> I) { int max = 0;int w = 0;for (Knapsack knapsack : P) {if (I.contains(knapsack)) {continue;}int temp = knapsack.getValue();if (max > temp) {max = temp;w = knapsack.getWeight();}}return new int[] { max, w };}/*** 得到所有子集** @param array* @return*/static List<List<Knapsack>> getSubLists(Knapsack[] array) {List<List<Knapsack>> allsubLists = new ArrayList<List<Knapsack>>();int max = 1 << array.length;for (int i = 0; i < max; i++) {List<Knapsack> subList = new ArrayList<Knapsack>();int k = i;int index = 0;while (k > 0) {if ((k & 1) > 0) {subList.add(array[index]);}k >>= 1;index++;}allsubLists.add(subList);}return allsubLists;}}程序入口:package knapsack;import java.util.ArrayList;import java.util.List;import javax.swing.JOptionPane;import algorithm.dynamicplan.Knapsack;public class K7_4 {public static void main(String[] args) {int n =Integer.valueOf(JOptionPane.showInputDialog("Input N:"));int m =Integer.valueOf(JOptionPane.showInputDialog("Input M:"));System.out.println("背包容量:"+m);List<Knapsack> P=new ArrayList<Knapsack>();P = KSMethod.InputData(n);int k =Integer.valueOf(JOptionPane.showInputDialog("Input K:"));Knapsack[] bags = P.toArray(new Knapsack[0]);String res = null;for (int i = 0; i < k; i++) {res= "最优解(价值总和):"+KSMethod.Solve(bags, m, n, i);System.out.println("当k="+i+":"+res);}}}6.运行结果及其相关描述:要求实例中物体的数量在20—100之间。