首页 > 其他分享 >【动态规划】0/1背包问题

【动态规划】0/1背包问题

时间:2024-08-15 19:27:07浏览次数:7  
标签:背包 int 重量 价值 beibao1 动态 规划 dp

题目描述

有个背包可承受重量 N,现有 T 件物品
每件物品重量为 Wi,价值为 Vi ,每件物品只有一个,
这个背包可以装载物品的最大价值是多少?

输入
从文件 beibao1.in 中读入数据。

一行两个正整数 N T,之间用空格隔开
后面T行,每行两个正整数,分别表示重量 Wi,价值 Vi

输出
输出到文件 beibao1.out 中。

这个背包可以装载物品的最大价值

样例输入

100 5
77 92
22 22
29 87
50 46
99 90

样例输出

133

正片开始

这是一道十分不淼的题,致以本蒟蒻打下了大片江山:

额,这题就是塞更多的东西进有空间限制的背包嘛

首先想到了贪心,先排个序嘛,然后再拿价值大的物品,结果不行,别问为什么,你猜答案错误27.3是怎么来的?

正解即为:开一个 D P数组,下标表示这个 DP 数组最大可以存的数,然后一个个试物品,代码:(看不懂就算了)x 代表:容量/重量,y 表示价值

if(dp[j].x==0 && dp[j].x+a[i].x<=j) {
	dp[j].x+=a[i].x;
	dp[j].y+=a[i].y;
	continue;
}
if(dp[j].x!=0) {
	if(dp[j].x+a[i].x<=j) {
		dp[j].x+=a[i].x;
		dp[j].y+=a[i].y;
		int xx=j-dp[j].x;
		dp[j].x+=dp[xx].x;
		dp[j].y+=dp[xx].y;
	} else {
		if(dp[j].y<=a[i].y) {
			dp[j].y=a[i].y;
			dp[j].x=a[i].x;
		}
	}
}

优化一下》》

for (int i=1; i<=t; i++)
		for(int j=n; j>=a[i].x; j--)
			dp[j]=max(dp[j-a[i].x]+a[i].y,dp[j]);

完整代码:

#include <bits/stdc++.h>
using namespace std;
int n, t;
struct Node {
	int x, y;//x:重量,y:价值
} a[99999999];
int dp[9999999];
int ans;
int main() {
//	freopen("beibao1.in", "r", stdin);
//	freopen("beibao1.out", "w", stdout);
	cin>>n>>t;
	for (int i=1; i<=t; i++) {
		cin>>a[i].x>>a[i].y;
	}
	for (int i=1; i<=t; i++) 		
		for(int j=n; j>=a[i].x; j--)
			dp[j]=max(dp[j-a[i].x]+a[i].y,dp[j]);
	cout<<dp[n];
	return 0;
}

标签:背包,int,重量,价值,beibao1,动态,规划,dp
From: https://www.cnblogs.com/ACyming/p/18361650

相关文章

  • cxgrid使用三问1cxgrid 如何动态创建列2cxGrid 通过字段名取得列3cxGrid动态创建的列
    //1cxgrid动态创建列procedureTFrmRuleEdit.CreateCols;varColumn:TcxGridDBColumn;begincdsPowerPrj.First;whilenotcdsPowerPrj.EofdobeginColumn:=viewPower.CreateColumn;Column.Caption:=cdsPowerPrj.FieldByName('description').Text;Column.D......
  • 代码随想录算法训练营 | 动态规划 part01
    509.斐波那契数509.斐波那契数状态转移方程:F(0)=0,F(1)=1F(n)=F(n-1)+F(n-2),其中n>1递归,太多重复计算classSolution{public:intfib(intn){if(n==0||n==1){returnn;}returnfib(n-1)......
  • 【C++】动态内存(二)智能指针
    由于new和delete会造成一定程度的内存泄漏问题,以及内存所有权不清晰,因此引入自动销毁相应内存空间的智能指针。智能指针是抽象数据类型,本身具有析构函数,因此调用之后会自动调用析构函数,在析构函数中会自动调用delete来释放相应内存空间,因此不用手动显式的调用delete。【......
  • Windows通过dynv6提供免费的IPv6动态域名解析(DDNS)服务(注册服务的方式运行)
    Dynv6IPv6Updater项目简介特性使用方法环境依赖运行脚本参数说明示例日志输出Windows服务注册步骤1:下载并安装NSSM步骤2:准备Python环境和脚本步骤3:使用NSSM注册服务步骤4:启动服务并验证步骤5:设置日志记录(可选)步骤6:重启系统并验证附:以下为帮......
  • C#根据传入的字段名,动态分组,支持多字段分组
     分组方法DynamicLinqExtensions:///<summary>///动态构建分组表达式///</summary>///<typeparamname="T"></typeparam>///<paramname="propertyNames">上限最大7个元素</param>///<returns></returns>publ......
  • matlab求解多目标规划问题
    多目标规划是多目标决策的重要内容之一,在进行多目标决策时,当希望每个目标都尽可能的大(或尽可能的小)时,就形成了一个多目标规划问题。目录一、模型介绍1.标准模型2.求解思路二、常见问题1.统一最值目标2.统一量纲3.确定权重三、经典例题1.模型建立2.确定目标函数3.代码求解四......
  • React 高德地图 进京证 路线规划 问题小记
    一、加载问题用高德地图做了个进京证路线规划的功能,官网也是有React代码示例。但是吧,这个Demo有问题,地图是能加载成功,但是其他功能再用map这个变量肯定不行,果不其然是null,处理也简单,把公共变量都管理起来就行了。const[map,setMap]=useState(null);const[AMap,setAMa......
  • C/C++ 动态分配:malloc()和free()所涉及的空指针和强制类型转换、与new和delete的对比
    1、动态分配的内涵所谓动态内存分配,是指在程序运行时根据需要分配和释放内存,而不是在编译时确定内存需求。动态分配包括两方面的内涵:在堆上分配内存。对于linux的虚拟内存,可以分成以下5段:文本段、数据段(分初始化和未初始化数据段)、堆和栈。不使用动态分配定义一个变量,这个变......
  • 代码随想录算法训练营第43天:动态规划part10:子序列问题
    300.最长递增子序列力扣题目链接(opensnewwindow)给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。示例1:输入:nums=[10,9,2......
  • 生态系统NPP及碳源、碳汇模拟(土地利用变化、未来气候变化、空间动态模拟)
    由于全球变暖、大气中温室气体浓度逐年增加等问题的出现,“双碳”行动特别是碳中和已经在世界范围形成广泛影响。碳中和可以从碳排放(碳源)和碳固定(碳汇)这两个侧面来理解。陆地生态系统在全球碳循环过程中有着重要作用,准确地评估陆地生态系统碳汇及碳源变化对于研究碳循环过程、预......