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

news2024/9/22 23:21:24

一、实验目的

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Open-Sora揭秘:这款开源视频生成神器能否超越OpenAI的Sora?

近日&#xff0c;我开始研究开源视频生成项目Open-Sora。 Open-Sora的核心思想&#xff0c;其实就是通过开源的方式&#xff0c;让先进的视频生成技术能够普及到大众手中。 而且&#xff0c;它还提供了精简又用户友好的工具和内容。 这样一来&#xff0c;视频制作的复杂性就…

Postman接口做关联测试的方法步骤

应用场景 假设下一个接口登录需要上一个接口的返回值&#xff0c;例如请求需要先登录获取到token&#xff0c;下一个请求要携带对应的token才能进行请求 方法&#xff1a;通过设置全局变量/环境变量 方法一&#xff1a;设置全局变量 1.先请求登录接口&#xff0c;请求成功之后…

解决微信小程序代码包大小限制方法

1 为什么微信小程序单个包的大小限制为 2MB 微信小程序单个包的大小限制为 2MB 是出于以下几个考虑&#xff1a; 保证小程序的启动速度&#xff1a;小程序的启动速度是影响用户体验的关键因素之一。如果包太大&#xff0c;会导致小程序启动时间过长&#xff0c;从而影响用户体…

2024年【熔化焊接与热切割】报名考试及熔化焊接与热切割复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割报名考试考前必练&#xff01;安全生产模拟考试一点通每个月更新熔化焊接与热切割复审考试题目及答案&#xff01;多做几遍&#xff0c;其实通过熔化焊接与热切割模拟考试题库很简单。 1、【单选题】…

Java反射机制的讲解及其示例说明

Java 反射机制是指在运行时动态地获取类的信息以及操作对象的方式。它允许程序在运行时检查和操作类、方法、属性等&#xff0c;而不需要在编译时就确定这些属性。通过反射机制&#xff0c;我们可以在运行时动态地创建对象、调用方法、获取属性等。 Java 反射机制提供了以下主…

LeetCode每日一题【24. 两两交换链表中的节点】

思路&#xff1a;先创建虚拟头结点&#xff0c;再用双指针&#xff0c;两两交换 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr…

2024.3.21 QT

思维导图 自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面。&#xff08;不要使用课堂上的图片和代码&#xff0c;自己发挥&#xff0c;有利于后面项目的完成&#xff09; 要求&#xff1a; 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件相关设置&…

C++的vector类(一):vector类的常见操作

目录 前言 Vector类 遍历与初始化vector ​vector的扩容机制 vector的对象操作 find与insert 对象数组 前言 string类中还有一些内容需要注意&#xff1a; STL 的string类怎么啦&#xff1f; C面试中string类的一种正确写法 C STL string的Copy-On-Write技术 C的st…

java 继承(上)

在说继承之前&#xff0c;先看Student、Teacher这两个类&#xff0c;通过下面的代码可以看出什么&#xff1f; 细心的你可能已经有所发现了&#xff0c;那就是它们都含有相同的属性和方法。 如果把相同特征提取出来&#xff0c;放到一个类中&#xff0c;暂时先把这个类叫做 Tan…

【Linux】多线程概念 | POSIX线程库

文章目录 一、线程的概念1. 什么是线程Linux下并不存在真正的多线程&#xff0c;而是用进程模拟的&#xff01;Linux没有真正意义上的线程相关的系统调用&#xff01;原生线程库pthread 2. 线程和进程的联系和区别3. 线程的优点4. 线程的缺点5. 线程异常6. 线程用途 二、二级页…

25.删除链表中倒数第N个结点

题意&#xff1a;给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 class Solution { public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummyHeadnew ListNode(0); //定义虚拟头结点ListNode* fastdummyHead; //定…

32.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-网络数据分析原理与依据

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;31.其它消息的实…

浅谈游戏地图中位置实时更新的技术方案

地图如今在游戏中发挥的作用越来越重要&#xff0c;随着电子竞技的兴起&#xff0c;地图逐渐成为了为玩家创造体验的直接舞台。希望本文能对有兴趣了解游戏地图背后实现原理的同学一些帮助。 什么是游戏地图 在游戏中可以通过3D场景虚拟一个完整的世界&#xff0c;当3D场景较为…

基于springboot的大学生租房平台系统

技术&#xff1a;springbootmysqlvue 一、系统背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对大学生租房信息管理混乱…

C语言每日一题07

一、题目 二、解析 逻辑与 &&、逻辑或 || 均有“短路”特性: 逻辑与&&“短路”&#xff1a;当逻辑与&&的左操作数为逻辑 “假“ 时&#xff0c;就足以判断该逻辑运算的结果为假了&#xff0c;故右操作数就不再被执行。 逻辑或||“短路”&#xff1a…

使用PLCSIM Advanced仿真博途运动控制

作者顾工首先&#xff0c;添加一个CPU&#xff0c;直接添加一个1518T&#xff0c;反正仿真&#xff0c;不用最好的干嘛呢。是吧。当然&#xff0c;你也可以添加一个你喜欢的PLC&#xff0c;这里不强求。 然后添加工艺对象&#xff0c;我们简单添加一个定位轴。 在工艺对象&am…

GPT-5揭秘:Lex Fridman与Sam Altman播客热议,AGI时代的新变革即将来临!

嘿&#xff0c;朋友们&#xff0c;你们知道吗&#xff1f;Lex Fridman和Sam Altman又聚在一起了&#xff0c;这次是在播客上。 在播客中&#xff0c;他们聊了很多&#xff0c;包括董事会的幕后故事、Elon Musk的诉讼案&#xff0c;甚至还提到了Ilya、Sora这些名字。 但真正让…

跟着官方文档一步一步搭建Elastic Stack(3节点ES集群+Kibana+Filebeat+Metricbeat)

文章目录 源码仓库硬件要求配置文件docker-compose.ymlfilebeat.ymlmetricbeat.yml 配置项解读以及注意事项docker-compose.yml解读filebeat配置解读metricbeat配置解读SSL配置ILM配置 运行运行截图 写在最后 本篇文章是使用Filbeat将产品环境的access_lo同步至Elastic Stack中…

SSTI漏洞详解

目录 前备知识 模块引擎&#xff1a; 模块渲染函数&#xff1a; 继承关系&#xff1a; SSTI漏洞简介 SSTI漏洞成因 SSTI漏洞原理 一些常见模块介绍 php Twig模块引擎 代码演示1 Twig模块引擎代码演示2 python flask模块 代码演示1&#xff1a; python jinja模块 代…

Net安卓app BroadcastReceiver 使用记录一坑

1.背景 由于项目需要&#xff0c;需要对接别的app的广播&#xff0c;就看了看Net 安卓开发的广播接收&#xff0c;看官网的介绍单纯广播和接收都挺简单的&#xff0c;于是上手样板项目弄了两个demo出来&#xff0c;app1用来发&#xff0c;app2用来收。 2.版本 &#xff1a;使…