王红梅《算法设计与分析(第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
*/







 

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、付费专栏及课程。

余额充值