王红梅《算法设计与分析(第3版)》部分课后实验代码

【教材信息】
书名:算法设计与分析(第3版)
ISBN:9787302594390
作者:王红梅


 

【递推法:杨辉三角形】

#include <bits/stdc++.h>
using namespace std;

const int maxn=20;
int a[maxn][maxn];

int main() {
	cout<<"Please input an integer (<=10): ";
	int n;
	cin>>n;
	for(int i=0; i<n; i++) {
		for(int j=0; j<n; j++) {
			a[i][j]=1;
		}
	}

	for(int i=1; i<n; i++) {
		for(int j=1; j<i; j++) {
			a[i][j]=a[i-1][j]+a[i-1][j-1];
		}
	}

	for(int i=0; i<n; i++) { //Output as an isosceles triangle
		for(int k=0; k<26-(5*i/2); k++) {
			printf(" ");
		}

		for(int j=0; j<=i; j++) {
			printf("%5d", a[i][j]);
		}
		printf("\n");
	}

	return 0;
}


/*
Please input an integer (<=10): 7
                              1
                            1    1
                         1    2    1
                       1    3    3    1
                    1    4    6    4    1
                  1    5   10   10    5    1
               1    6   15   20   15    6    1
*/

【分治法:九连环问题】

#include <stdio.h>
#include <string.h>
 
int step;
void up(int n);
void down(int n);
 
void down(int n) {
	if(n==1)
		printf("%d:1 DOWN\n",++step);
	else if(n<=0) return;
	else {
		down(n-2);
		printf("%d:%d DOWN\n",++step,n);
		up(n-2);
		down(n-1);
	}
}
 
void up(int n) {
	if(n==1)
		printf("%d:1 UP\n",++step);
	else if(n<=0) return ;
	else {
		up(n-1);
		down(n-2);
		printf("%d:%d UP\n",++step,n);
		up(n-2);
	}
}
 
int main() {
	int n;
	scanf("%d",&n);
	
	printf("UP's step:\n");
	step=0;
	up(n);
	
	printf("DOWN's step:\n");
	step=0;
	down(n);
	
	printf("END\n");
	
	return 0;
}
 
 
/*
3
UP's step:
1:1 UP
2:2 UP
3:1 DOWN
4:3 UP
5:1 UP
DOWN's step:
1:1 DOWN
2:3 DOWN
3:1 UP
4:2 DOWN
5:1 DOWN
END
*/

【贪心法:田忌赛马】

#include <bits/stdc++.h>
using namespace std;

const int maxn=1000;
int t[maxn],q[maxn];
int money,tlow,qlow,thigh,qhigh;

int main() {
	int n;
	cin>>n;
	for(int i=0; i<n; i++) cin>>t[i];
	for(int i=0; i<n; i++) cin>>q[i];
	sort(t,t+n);
	sort(q,q+n);

	tlow=qlow=0;
	thigh=qhigh=n-1;

	while(tlow<=thigh) {
		if(t[thigh]>q[qhigh]) {
			money+=200;
			thigh--;
			qhigh--;
		} else if(t[thigh]<q[qhigh]) {
			money-=200;
			tlow++;
			qhigh--;
		} else {
			if(t[tlow]>q[qlow]) {
				money+=200;
				tlow++;
				qlow++;
			} else {
				if(t[tlow]<q[qhigh]) money-=200;
				tlow++;
				qhigh--;
			}
		}
	}
	cout<<money<<endl;

	return 0;
}

/*
in:
5
5 2 8 6 2
6 1 8 5 3
out:
600
------------
in:
3
92 83 71
95 87 78
out:
200
*/

【动态规划法:数塔问题】

#include <bits/stdc++.h>
using namespace std;
 
const int maxn=1005;
const int inf=0x3f3f3f3f;
int a[maxn][maxn];
int f[maxn][maxn];
 
int ans=-inf;
 
int main() {
	int n;
	cin>>n;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=i; j++) {
			cin>>a[i][j];
		}
	}
 
	for(int i=1; i<=n; i++) {
		for(int j=0; j<=i+1; j++) { 
			f[i][j]=-inf; //若输入有负数,此段代码就能避坑
		}
	}
 
	f[1][1]=a[1][1];
	for(int i=2; i<=n; i++) {
		for(int j=1; j<=i; j++) {
			f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j];
		}
	}
 
	for(int i=1; i<=n; i++) {
		ans=max(ans,f[n][i]);
	}
	cout<<ans<<endl;
 
	return 0;
}
 
 
/*
in:
5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
out:
86
-----------------------------
in:
5
3
2 6
1 8 7
9 1 3 6
2 5 3 2 1
out:
24
-----------------------------
in:
10
-6
-4 -5
-3 7 5
3 7 -2 1
10 2 -6 2 -6
-8 3 8 6 7 9
-4 -10 0 -3 4 9 2
0 5 5 5 10 -6 -5 -4
-9 7 4 9 8 -5 -2 3 2
-7 -4 0 -10 -8 -4 3 -5 8 9
out:
25
*/







 

  • 7
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
算法设计与分析 作者-红梅社-清华大学出社 出日期-07 1 2006. 共262页 目录 第 1 章 绪论 1 .1 算的基本概念 1 . 1 . 1 为什么要学习算 1 . 1 . 2 算及其重要特性 1 . 1 . 3 算的描述方 1 . 1 . 4 算设计的一般过程 1 . 1 . 5 重要的问题类型 1 .2 算分析 1 . 2 . 1 渐进符号 1 . 2 . 2 最好、 最坏和平均情况 1 . 2 . 3 非递归算的分析 1 . 2 . 4 递归算的分析 1 . 2 . 5 算的后验分析 1 .3 实验项目— — —求最大公约数 阅读材料— — —人工神经网络与 BP 算 习题 1 第 2 章 NP 完全理论 2 .1 下界 2 . 1 . 1 平凡下界 2 . 1 . 2 判定树模型 2 . 1 . 3 最优算 2 .2 算的极限 2 . 2 . 1 易解问题与难解问题 2 . 2 . 2 实际问题难以求解的原因 2 . 2 . 3 不可解问题 2 .3 P 类问题和 NP 类问题 2 .3 .1 判定问题 2 .3 .2 确定性算与 P 类问题 2 .3 .3 非确定性算与 NP 类问题 2 .4 NP 完全问题 2 .4 .1 问题变换与计算复杂性归约 2 .4 .2 NP 完全问题的定义 2 .4 .3 基本的 NP 完全问题 2 .4 .4 NP 完全问题的计算机处理 2 .5 实验项目— — —SAT 问题 阅读材料— — —遗传算 习题 2 第 3 章 蛮力 3 .1 蛮力的设计思想 3 .2 查找问题中的蛮力 3 .2 .1 顺序查找 3 .2 .2 串匹配问题 3 .3 排序问题中的蛮力 3 .3 .1 选择排序 3 .3 .2 起泡排序 3 .4 组合问题中的蛮力 3 .4 .1 生成排列对象 3 .4 .2 生成子集 3 .4 .3 0 / 1 背包问题 3 .4 .4 任务分配问题 3 .5 图问题中的蛮力 3 .5 .1 哈密顿回路问题 3 .5 .2 TSP 问题 3 .6 几何问题中的蛮力 3 .6 .1 最近对问题 3 .6 .2 凸包问题 3 .7 实验项目— — —串匹配问题 阅读材料— — —蚁群算 习题 3 第 4 章 分治法 4 .1 概述 4 .1 .1 分治法的设计思想 4 .1 .2 分治法的求解过程 4 .2 递归 4 .2 .1 递归的定义 4 .2 .2 递归函数的运行轨迹 4 .2 .3 递归函数的内部执行过程 4 .3 排序问题中的分治法 4 .3 .1 归并排序 4 .3 .2 快速排序 4 .4 组合问题中的分治法 4 .4 .1 最大子段和问题 4 .4 .2 棋盘覆盖问题 4 .4 .3 循环赛日程安排问题 4 .5 几何问题中的分治法 4 .5 .1 最近对问题 4 .5 .2 凸包问题 4 .6 实验项目— — —最近对问题 阅读材料— — —鱼群算 习题 4 第 5 章 减治 5 .1 减治的设计思想 5 .2 查找问题中的减治 5 .3 排序问题中的减治 5 .4 组合问题中的减治 5 .5 实验项目— — —8 枚硬币问题 阅读材料— — —粒子群算 习题 5 第 6 章 动态规划 6 .1 概述 6 .2 图问题中的动态规划 6 .3 组合问题中的动态规划 6 .4 查找问题中的动态规划 6 .5 实验项目— — —最大子段和问题 阅读材料— — —文化算 习题 6 第 7 章 贪心法 7 .1 概述 7 .2 图问题中的贪心法 7 .3 组合问题中的贪心法 7 .4 实验项目— — —霍夫曼编码 阅读材料— — —模拟退火算 习题 7 第 8 章 回溯 8 .1 概述 8 .2 图问题中的回溯 8 .3 组合问题中的回溯 8 .4 实验项目— — —0/ 1 背包问题 阅读材料— — —禁忌搜索算 习题 8 第 9 章 分支限界 9 .1 概述 9 .2 图问题中的分支限界 9 .3 组合问题中的分支限界 9 .4 实验项目— — —电路布线问题 阅读材料— — —免疫算 习题 9 第 10 章 概率算 10 .1 概述 10 .1 .1 概率算的设计思想 10 .1 .2 随机数发生器 10 .2 舍伍德(Sherwood)型概率算 10 .2 .1 快速排序 10 .2 .2 选择问题 10 .3 拉斯维加斯( Las Vegas)型概率算 10 .3 .1 八皇后问题 10 .3 .2 整数因子分解问题 10 .4 蒙特卡罗(Monte Ca rlo)型概率算 10 .4 .1 主元素问题 10 .4 .2 素数测试问题 10 .5 实验项目— — —随机数发生器 阅读材料— — —DNA 计算与 DNA 计算机 习题 10 第 11 章 近似算 11 .1 概述 11 .1 .1 近似算的设计思想 11 .1 .2 近似算的性能 11 .2 图问题中的近似算 11 .2 .1 顶点覆盖问题 11 .2 .2 TSP 问题 11 .3 组合问题中的近似算 11 .3 .1 装箱问题 11 .3 .2 子集和问题 11 .4 实验项目— — —TSP 问题的近似算 阅读材料— — —量子密码技术 习题 11 第 12 章 计算复杂性理论 12 .1 计算模型 12 .1 .1 图灵机的基本模型 12 .1 .2 k 带图灵机和时间复杂性 12 .1 .3 离线图灵机和空间复杂性 12 .2 P 类问题和 NP 类问题 12 .2 .1 非确定性图灵机 12 .2 .2 P 类语言和 NP 类语言 12 .3 NP 完全问题 12 .3 .1 多项式时间变换 12 .3 .2 Cook 定理 12 .4 实验项目— — —NP 完全问题树 阅读材料— — —算优化策略
0 1背包问题是一例典型的组合优化的NP完全问题 问题可以描述为:给定一组共n个物品 每种物品都有自己的重量wi i 1 n和价值vi i 1 n 在限定的总重量(背包的容量C)内 如何选择才能使得选择物品的总价值之和最高 选择最优的物品子集放置于给定背包中 最优子集对应n元解向量 x1 …xn xi∈{0或1} 因此命名为0 1背包问题 0 1背包问题是许多问题的原型 但它又是一个NP完全问题 此实验主要研究和实现n 0< n< 200 和C C< 2000 C为整数 都较大的情形 随机产生n个物品的重量向量wi 1< wi< 100 wi为整数 和价值向量vi 1< vi< 100 vi为整数 0 1背包问题可以用许多方来求解 有些算可以得到问题的精确最优解 有些仅能获得一个近似最优解 本综合设计性实验要求用3种以上的方求解0 1背包问题 获得精确最优解或近似最优解皆可 并对所采用的多种算从运行时间 寻找是否为最优解 能够求解的问题规模等方面进行对比和分析 本课程讲述的所有算思想都可以用来求解此问题 甚至本课程未涉及的许多算也非常适合于求解此问题 学生可以先尝试先用本课程已介绍的算来实现和分析 学有余力或兴趣驱动下可以寻找一些智能算的资料来试一试 涉及的方可以有:蛮力求解 递归求解 动态规划求解 贪心求解 回溯求解 广度优先的分支限界求解 优先队列的启发式分支限界 遗传算 模拟退火算 蚁群算 粒子群算等 ">0 1背包问题是一例典型的组合优化的NP完全问题 问题可以描述为:给定一组共n个物品 每种物品都有自己的重量wi i 1 n和价值vi i 1 n 在限定的总重量(背包的容量C)内 如何选择才能使得选择物品的总价值之和最高 选择 [更多]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值