动态规划背包问题(例题)

动态规划背包问题(例题)发生的方式

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

动态规划题目背包问题(例题分析)

物品编号 1 2 3 4
物品体积 2 3 4 5
物品价值 3 4 5 6
求容积为8的背包能装的最大价值为多少?

解题思路

动态规划解题步骤
1)确定状态
注意: 动态规划一般要开数组,首先要明确数组的每个元素所代表的意义。
确定状态需要两个意识:(1)最后一步(2)子问题。
2)转移方程的确定
3)初始化条件和边界情况
注意:初始状态大部分都是为零,用转移方程算不出来的才需要手动定义状态。
4)计算顺序
注意:一般的计算顺序是从小到大,从上到下从左到右(二维)。

本题的状态转移方程很容易就可以得出来是f[i][j]=max(f[i-1][j], f[i-1][j-vol[i]]+val[i])
这里有两个方面需要考虑,第一个是你准备将第i件物品放入,第二是你不准备放入。所以你首先需要比较体积大小,然后比较物品价值。f[i-1][j]是你没有放入物品时的情况,f[i-1][j-vol[i]]+val[i]是你要放入物品时,计算当前物品和剩余空间价值的和。然后求他们的最大值max。

本题还提供了back(),是求解到底去了哪几件物品,是背包问题的回溯。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cstdio>
using namespace std;
int val[]={ 
   0,3,4,5,6};
int vol[]={ 
   0,2,3,4,5};
int f[5][9];
bool flag[5]={ 
   true};
//背包的容积为8
//物品编号1,2,3,4
//物品容积2,3,4,5
//物品体积3,4,5,6 

int maxvalue(){ 
   
	
	for(int i=0; i<=4; i++){ 
   
		for(int j=0; j<=8; j++){ 
   
			if(i==0 || j==0){ 
   
				f[i][j]=0; 
			}else{ 
   
				if(vol[i]<=j)
					f[i][j]=max(f[i-1][j], f[i-1][j-vol[i]]+val[i]);
				else{ 
   
					f[i][j]=f[i-1][j];
				}
			}
		}
	}
	
} 

int back(int i, int j){ 
   
	if(i==0){ 
   
		for(int i=1; i<5; i++){ 
   
			if(flag[i]) cout<<i<<" ";
		}
	}
	if(f[i][j]==f[i-1][j]){ 
   
		back(i-1,j);
	}
	else if(f[i][j]==f[i-1][j-vol[i]]+val[i]){ 
   
		flag[i]=true;
		back(i-1,j-vol[i]);
	}
}

int main(){ 
   
	maxvalue();
	for(int i=0; i<=4; i++){ 
   
		for(int j=0; j<=8; j++){ 
   
			printf("%4d",f[i][j]);
		}
		cout<<endl;
	}
	
	back(4,8);
	return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164411.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • J2ME开发初探

    J2ME开发初探摘要:本文是J2ME开发的入门性文章,从零开始介绍了进行J2ME开发首先需要了解的一些东西。阅读本文几乎不需要相关的基础知识。1.1.       J2ME简介J2ME是Java2Platform,MicroEdition的简称。它是SunMicrosystems公司在Java的品脾之下的四种平台之一,其他三种分别是J2SE,J2EE和JavaCard。J2ME的目标是消费

    2022年7月11日
    19
  • PS制作CSS精灵图

    PS制作CSS精灵图精灵图简介1.精灵图(雪碧图)(1)问题:精灵图就是将很多的小图标合并到一张较大的图片中,那精灵是啥意思呢?(为此笑了一下午的我)。(2)精灵图也称雪碧图,由于大型网页首次加载需要时间,如果再加之加载小图标的时间,则会严重影响到用户体验。所以,考虑到在同一时间内,服务器拥堵的情况,使用精灵图来解决这一问题。那么怎么制作精灵图呢2.使用ps制作精灵图的详细步骤示例:将如下图图片中的四个图…

    2022年6月7日
    183
  • php连接ldap服务器,使用PHP连接LDAP服务器[通俗易懂]

    php连接ldap服务器,使用PHP连接LDAP服务器[通俗易懂]LDAP是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址本使用。LDAP最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。要特别注意的是,LDAP通常作为一个hierarchal数据库使用,而不是一个关系数据库。因此,它的结构用树来表示比用表格好。正因为这样,就不能用SQL语句了。简单说来,LD…

    2022年5月15日
    32
  • nginx实现负载均衡几种方式_nginx如何负载均衡

    nginx实现负载均衡几种方式_nginx如何负载均衡Nginx负载均衡配置实例详解(转)负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦。负载均衡先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可以解释N台服务器平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。那么负载均衡的前提就是要有多台服务器才能实现,也就是两台以上即可。测试环境由于没有服务器,所以本次测试直接host指定域名,然后在VMware里安装了三台CentOS。测试域名

    2025年6月3日
    3
  • FileInputStream读取文件数据的两种方式

    FileInputStream读取文件数据的两种方式FileInputStream(文件字节读取流):read():一个一个字节的读read(byte[]buf):先把字节存入到缓冲区字节数组中,一下读一个数组(常用)importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava….

    2022年5月5日
    332
  • 深入浅出JVM调优,看完你就懂

    深入浅出JVM调优,看完你就懂深入浅出JVM调优基本概念:JVM把内存区分为堆区(heap)、栈区(stack)和方法区(method)。由于本文主要讲解JVM调优,因此我们可以简单的理解为,JVM中的堆区中存放的是实际的对象,是需要被GC的。其他的都无需GC。下图文JVM的内存模型从图中我们可以看到,1、JVM实质上分为三大块,年轻代(YoungGen),年老代(OldMemory…

    2022年6月1日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号