当前位置:文档之家› 算法设计与分析

算法设计与分析

算法设计与分析实验报告
姓名:888
学号:129074999
老师:许精明
实验1:杨辉三角
解法思路:
根据杨辉三角中除最外层(不包括杨辉三角底边)的数为1外,其余的数都是它肩上两个数之和这一性质,用数组输出杨辉三角。

根据杨辉三角的第n行恰好是C(n,0)~C(n,n),可以不用数组输出,而用动态规划。

这里的C表示组合。

注:由于为了便于控制输出格式,程序中的最大输出行确定的较小,但程序本身并没有错误。

若要输出更多行,需要增加控制输出格式的语句。

解法一:数组
#include<stdio.h>
void print(int *row,int n)
{
int i;
for(i=1;i<n;i++)
{
if(row[i]!=0)
{
printf("%d",row[i]);
row[i]=0;//置为初始态,方便保存下一行
}
else
printf(" ");
}
printf("\n");
}
void initia(int num)
{
int up_row[20];
int next_row[20];
int i,j;
for(i=0;i<=num*2;i++)
{
up_row[i]=0;
next_row[i]=0;
}
up_row[num]=next_row[num]=1;
for(i=0;i<num;i++)//控制行
{
for(j=1;j<num+i+1;j++)
{
up_row[j]=next_row[j];//保存当前输出行
}
print(next_row,num+i+1);//本行输出的有效数据个数为当前行数
for(j=1;j<=num+i+1;j++)//0号位的值保留以便下行计算
{
next_row[j]=up_row[j-1]+up_row[j+1];//下一行相应位置的值是上一行相应位置左右值的和
}
}
}
int main(void)
{
int num_row;
printf("确定行数(小于10):");
scanf("%d",&num_row);
initia(num_row);
return 0;
}
运行截图:
解法二:动态规划
#include <stdio.h>
#define MAXH 31
int main(void)
{
unsigned long num[MAXH]={0};
int i,j;
int n;
printf("Input a number to set row:");
scanf("%d",&n);
num[0]=1;
for(i=0;i<n;i++)
{
for(j=i;j>0;j--)
{
num[j] = num[j] + num[j-1];
printf(" %d ",num[j]);
}
printf(" %d \n",1);
}
return 0;
}
运行截图:
实验二:0-1背包
问题描述:给定n 种物品和一背包,物品i 的重量是wi ,其价值为vi ,背包的容量为C 。

应如何选择装入背包的物品(物品不能分割),使得装入背包中物品的总价值最大。

程序实现:
运行截图:
实验三:斐波那挈数列
运行截图:。

相关主题