算法与设计实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法与分析实验报告软件工程专业
安徽工业大学
指导老师:许精明
实验内容
1:杨辉三角
2:背包问题
3:汉诺塔问题
一:实验目的
1:掌握动态规划算法的基本思想,学会用其解决实际问题。
2:通过几个基本的实验,提高算法分析与设计能力,提高动手操作能力和培养良好的编程习惯。
二:实验内容
1:杨辉三角
2:背包问题
3:汉诺塔问题
实验一:杨辉三角
问题分析:
①每行数字左右对称,由1开始逐渐变大,然后变小,回到1。
②第n行数之和为2^n。
③下一行每个数字等于上一行的左右两个数字之和。
算法设计及相关源代码:
public void yanghui(int n) {
int[] a = new int[n];
if(n==1){
System.out.println(1);
}else if(n==2) {
System.out.print(1 + " " +1);
}else{
a[1]=1;
System.out.println(a[1]);
a[2]=1;
System.out.println(a[1]+" "+a[2]);
for(int i=3;i<=n;i++){
a[1]=a[i]=1;
for(int j=i-1;j>1;j--){
a[j]=a[j]+a[j-1];
}
for(int j=1;j<=i;j++){
System.out.print(a[j]+" ");
}
System.out.println();
}
}
}
实验结果:n=10
实验二:0-1背包问题
问题分析::令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就
j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数:
(1) V(i,0)=V(0,j)=0
(2) V(i,j)=V(i-1,j) j V(i,j)=max{V(i-1,j) ,V(i-1,j-w i)+v i) } j>w i (1)式表明:如果第i个物品的重量大于背包的容量,则装人前i个物品得到的 最大价值和装入前i-1个物品得到的最大价是相同的,即物品i不能装入背包; 第(2)个式子表明:如果第i个物品的重量小于背包的容量,则会有一下两种情况:(a)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量位j-w i的背包中的价值加上第i个物品的价值v i;(b)如果第i个物品没有装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。 显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。时间复杂度 时间复杂度为o(V* T) ,空间复杂度为o(V * T) 。 算法设计及相关代码: public class beibaoProblem { static int[] a = new int[5]; // 背包重量 static int[] b = new int[5]; // 结果数组 static int flag = 0; // 下一个候选项 static int bound = 20; // 总重量 static int totle = 0; // 每次选择后的总重量 /** * @param i 元素坐标 * @param leftbound 目标重量 * @param t */ public static void inserttry(int i, int leftbound, int t) { if (i < 5 && leftbound <= totle) { if (a[i] < leftbound) { // 当前的所选的数小于已选数的总和,将 当前所选的数放入结果数组,从目标重量减掉当前所选数,递归,选择后的重量数减掉当前所选数 b[t++] = a[i]; totle = totle - a[i]; leftbound = leftbound - a[i]; i++; inserttry(i, leftbound, t); } else if (a[i] > leftbound) { // 当前的所选的数大于已选数的总和,不符合条件,选择后的重量数减掉当前所选数,递归 totle = totle - a[i]; i++; inserttry(i, leftbound, t); } else { // 当前所选的数等于已选数的总和 b[t] = a[i]; return; } } else { // 数组中没有符合当前条件的元素,将前一个数值移除,递归 leftbound = leftbound + b[--t]; for (int f = 0; f < 5; f++) { if (a[f] == b[t]) { flag = ++f; break; } } b[t] = 0; totle = 0; for (int m = flag; m < 5; m++) { totle += a[m]; } inserttry(flag, leftbound, t); } return; } public static void main(String[] args) { a[0] = 11; a[1] = 8; a[2] = 6;