算法设计与分析-动态规划算法的应用——沐雨先生

一、实验目的

1. 掌握动态规划算法的基本思想,包括最优子结构性质和基于表格的最优值计算方法。

2.熟练掌握分阶段的和递推的最优子结构分析方法。

3. 学会利用动态规划算法解决实际问题 。

二、实验内容

1. 问题描述 :数据输入可个人设定,由键盘输入。(下述题目请在上机前完成程序代码的准备,之后在机房完成撰写代码、结果截图及实验报告提交),

题目一:数塔问题
给定一个数塔,其存储形式为如下所示的下三角矩阵。在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。请找出一条路径,使路径上的数值和最大。
输入样例(数塔):
9
12 15
10 6 8
2 18 9 5
19 7 10 4 16
输出样例(最大路径和):
59
在这里插入图片描述
题目二 0-1 背包问题
给定 n 种物品和一个背包。物品 i 的重量是 wi ,其价值为 vi ,背包的容量为 c 。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大 ? 在选择装入背包的物品时,对每种物品只有两个选择:装入或不装入,且不能重复装入。输入数据的第一行分别为:背包的容量 c ,物品的个数 n 。接下来的 n 行表示 n 个物品的重量和价值。输出为最大的总价值。
输入样例:
20 3
11 9
9 10
7 5
输出样例
19
在这里插入图片描述

源程序

题目一

#include<stdio.h>
int main(){
	int a[50][50][3];
	int n,i,j;
	printf("请输入三角形行数:");
	while(scanf("%d",&n)!=EOF){
		for(i=1;i<=n;i++)
			for(j=1;j<=i;j++){
				scanf("%d",&a[i][j][1]);
				a[i][j][2]=a[i][j][1];
				a[i][j][3]=0;
			}
		for(i=n-1;i>=1;i--)
			for(j=1;j<=i;j++){
				if(a[i+1][j][2]>a[i+1][j+1][2]){
					a[i][j][2]+=a[i+1][j][2];
					a[i][j][3]=0;
				}
				else {
					a[i][j][2]+=a[i+1][j+1][2];
					a[i][j][3]=1;
				}
			}
			printf("最大路径之和为:%d\n",a[1][1][2]);
			printf("路径为:\n");
			j=1;
			for(i=1;i<n;i++){
				printf("%d->",a[i][j][1]);
				j+=a[i][j][3];
			}
			printf("%d\n",a[i][j][1]);
		}
}

题目二

#include<stdio.h>
#include<stdlib.h>

int V[100][100];//前i个物品装入容量为j的背包中获得的最大价值

int max(int a,int b){
   if(a>=b)
       return a;
   else return b;
}
 
int KnapSack(int n,int weight[],int value[],int C){
    int i;
	//填表,其中第一行和第一列全为0,即 V(i,0)=V(0,j)=0; 
    for(i=0;i<=n;i++)
        V[i][0]=0;
    for(int j=0;j<=C;j++)
        V[0][j]=0;
    //用到的矩阵部分V[n][C] ,下面输出中并不输出 第1行和第1列 
    
//	printf("编号 重量 价值  ");  //菜单栏 1 
//	for(i=1;i<=C;i++)
//		printf(" %2d ",i);
//	printf("\n\n");
		    
    for(i=1;i<=n;i++){
//		printf("%2d   %2d   %2d     ",i,weight[i-1],value[i-1]);  //菜单栏 2 (weight与value都是从0开始存的,所以开始i=1时对应0的位置)
		
        for(int j=1;j<=C;j++){
            if(j<weight[i-1]){  //包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的
				V[i][j]=V[i-1][j];
//				printf("%2d  ",V[i][j]);
			}
            else{  //还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个
                V[i][j]=max(V[i-1][j],V[i-1][j-weight[i-1]]+value[i-1]);		
//				printf("%2d  ",V[i][j]);
			}
		}
//		printf("\n");
	}
	
        return V[n][C];
        
}

void Judge(int C,int n,int weight[]){	//判断哪些物品被选中		
    int j=C,i;
    int *state=(int *)malloc(n*sizeof(int));
    
    for(i=n;i>=1;i--){
	    if(V[i][j]>V[i-1][j]){  //如果装了就标记,然后减去相应容量 
				state[i]=1;
				j=j-weight[i-1];
	        }
	    else
	        state[i]=0;
    }
    printf("选中的物品是:");
    for(i=1;i<=n;i++)
        if(state[i]==1)
        	printf("%d ",i);
    printf("\n");
}
 
int main(){

    int n,i;        //物品数量 
    int Capacity;//背包最大容量
    
    printf("请输入背包的最大容量:");
    scanf("%d",&Capacity);
    
    printf("输入物品数:");
    scanf("%d",&n);
    
    int *weight=(int *)malloc(n*sizeof(int));//物品的重量
    int *value=(int *)malloc(n*sizeof(int)); //物品的价值
    
    
    printf("请输入物品相应的的重量和价值:\n");
    for(i=0;i<n;i++)
        scanf("%d %d",&weight[i],&value[i]);
    int s=KnapSack(n,weight,value,Capacity);  //获得的最大价值
    
    Judge(Capacity,n,weight);  //判断那些物品被选择 
 
    printf("最大物品价值为: ");
    printf("%d\n",s);
   
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474294.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux之缓冲区与C库IO函数简单模拟

缓冲区 首先, 我们对缓冲区最基本的理解, 是一块内存, 用户提供的缓冲区就是用户缓冲区, C标准库提供的就是C标准库提供的缓冲区, 操作系统提供的就是操作系统缓冲区, 它们都是一块内存. 为什么要有缓冲区? 先举个生活中的例子, 我们寄快递的时候往往是去驿站寄快递, 而不是…

4 个多月的蓝猫吃什么猫粮发腮快?

亲爱的猫友们&#xff0c;你们是不是也在为蓝猫的发腮问题而苦恼呢&#xff1f;&#x1f431; 四个多月的蓝猫正处于生长发育的关键时期&#xff0c;选择合适的猫粮对于它们的健康与美丽至关重要。 &#x1f50d; 在选择猫粮时&#xff0c;我们要关注几个关键点&#xff1a;高…

Elasticsearch从入门到精通-06ES统计分析语法

Elasticsearch从入门到精通-06ES统计分析语法 bucket和metric概念简介 bucket就是一个聚合搜索时的数据分组。如&#xff1a;销售部门有员工张三和李四&#xff0c;开发部门有员工王五和赵六。那么根据部门分组聚合得到结果就是两个bucket。销售部门bucket中有张三和李四&…

window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)

window下安装并使用nvm&#xff08;含卸载node、卸载nvm、全局安装npm&#xff09; 一、卸载node二、安装nvm三、配置路径和下载源四、使用nvm安装node五、nvm常用命令六、卸载nvm七、全局安装npm、cnpm八、遇到的问题 nvm 全名 node.js version management&#xff0c;顾名思义…

远程桌面安卓版下载 安卓远程控制免费版

远程桌面安卓版下载与安卓远程控制免费版的应用解析 随着移动互联网的快速发展&#xff0c;远程桌面应用逐渐成为了许多用户、特别是技术爱好者和商务人士的必备工具。它们不仅可以在电脑上实现远程控制&#xff0c;还能将这种功能延伸到移动设备上&#xff0c;如安卓手机和平…

Acwing.167 木棒(回溯)

题目 乔治拿来一组等长的木棒&#xff0c;将它们随机地砍断&#xff0c;使得每一节木棍的长度都不超过 50 个长度单位。 然后他又想把这些木棍恢复到为裁截前的状态&#xff0c;但忘记了初始时有多少木棒以及木棒的初始长度。 请你设计一个程序&#xff0c;帮助乔治计算木棒…

年度告警分类统计

1、打开前端Vue项目kongguan_web&#xff0c;完成前端src/components/echart/YearWarningChart.vue页面设计 在YearWarningChart.vue页面添加div设计 <template><div class"home"><div style"margin: 0px auto;height: 100%"><div …

金蝶云星空——单据附件上传

文章目录 概要技术要点代码实现小结 概要 单据附件上传 技术要点 单据附件上传金蝶是有提供标准的上传接口&#xff1a; http://[IP]/K3Cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.AttachmentUpLoad.common.kdsvc 参数说明 参数类型必填说明FileName字符是…

基于springboot+vue的乡村民宿管理系统

一、系统架构 前端&#xff1a;vue | element-ui 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven | nodejs 二、代码及数据库 三、功能介绍 01. 登录页 02. 注册 03. 管理员-首页 04. 管理员-信息管理-公告信息 05. 管理员…

淘宝|天猫|京东|1688主流电商平台的实时数据返回接口|附Python实例

导读&#xff1a;随着淘宝/天猫直通车功能升级&#xff0c;很多功能越来越白盒化&#xff0c;越来越简化&#xff0c;更方便用户的操作&#xff0c;只需一键即可看出淘宝/天猫直通车存在的问题。淘宝/天猫直通车千人千面后有了实时数据工具&#xff0c;下面通过一个案例告诉大家…

【Android】【Bluetooth Stack】蓝牙电话本协议之同步通话记录分析(超详细)

1. 精讲蓝牙协议栈&#xff08;Bluetooth Stack&#xff09;&#xff1a;SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅&#xff0c;【蓝牙协议栈】专栏会持续更新中.....敬请期待&#xff01; 目录 1. 协议简述 1.1 PBAP…

Day02-DDLDMLDQL(定义,操作,查询)(联合查询,子查询,字符集和校对集,MySQL5.7乱码问题)

文章目录 Day02-DDL&DML和DQL学习目标1. SQL语言的组成2. DDL2.1 数据库结构2.2 表结构2.3 约束2.3.1 主键约束(重要)(1)特点(2) 添加主键(3)删除主键(了解) 2.3.2 自增约束(1)特点(2) 添加自增约束(3)删除自增约束(了解) 2.3.3 非空约束(1)添加非空约束(2) 删除非空约束 2…

day01_mysql数据类型和运算符_课后练习 - 参考答案

文章目录 day01_mysql_课后练习第1题第2题第3题第4题第5题 day01_mysql_课后练习 第1题 案例&#xff1a; 1、创建数据库day01_test01_library 2、创建表格books 字段名字段说明数据类型允许为空唯一b_id书编号int(11)否是b_name书名varchar&#xff08;50&#xff09;否否…

OLAP数据库选型指南:Doris与ClickHouse的深入对比与分析

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在当今数据驱动的时代&#xff0c;数据的存储、处理和分析变得尤为重要。为了满足这一需求&#xff0c;市场上涌现出了许多优秀的…

FPGA Vivado环境下实现D触发器

题目要求&#xff1a;使用Verilog HDL语言设计一个D触发器。请提交程序源代码和Word格式的作业文档&#xff0c;作业文档中应给出程序源代码及RTL分析原理图。 D触发器的工作原理&#xff1a; 初始状态下&#xff0c;触发器处于复位状态&#xff0c;输出为复位信号的稳定状态…

Linux笔试题

1. 程序代码如下&#xff0c;请按执行顺序写出输出结果: int main() { pid_t pid1,pid2;if((pid1fork()) 0) {sleep(3);printf(“info1 from child process_1\n”);exit(0);printf(“info2 from child process_1\n”); } else {if((pid2fork()) 0){sleep(1);printf(“i…

排序算法:快速排序(非递归)

文章目录 一、先建立一个栈二、代码编写 !](https://img-blog.csdnimg.cn/direct/870dd101173d4522862e4459b32237a3.png) 先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;^ _ ^<3 ❤️ ❤️ ❤️ 码字不易&#xff0c;大家的支持就是我坚持下去的动力…

力扣刷题-砖墙题554

砖墙题 这题一开始没有想到思路&#xff0c;一开始还想着用枚举法做/笑哭 后来看了题解&#xff0c;原来就是哈希表的题目呀。 说到哈希表&#xff0c;这里有个八股需要记一下&#xff1a; HashMap和HashTable的区别 线程是否安全&#xff1a;HashMap线程不安全 HashTable线…

[综述笔记]Flexible large-scale fMRI analysis: A survey

论文网址&#xff1a;Flexible large-scale fMRI analysis: A survey | IEEE Conference Publication | IEEE Xplore 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff0…

力扣热门算法题 56. 合并区间,57. 插入区间,58. 最后一个单词的长度v

56. 合并区间&#xff0c;57. 插入区间&#xff0c;58. 最后一个单词的长度&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.20 可通过leetcode所有测试用例。 目录 56. 合并区间 解题思路 完整代码 Python Java ​编辑 5…