【HDU2191】多重背包

本文深入探讨了多重背包问题,一种结合了01背包和完全背包特点的动态规划问题。通过详细解释多重背包的特性,文章提供了理解其核心概念的方法,并分享了一个基于动态规划的简单解法,帮助读者掌握解决此类问题的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.题目链接。中文题目就不再说题意了。首先我们知道这个题目的意思就是给你n中物品,每种物品有重量,价值,数量这三个属性。然后给定一个数值的钱,问这些钱最可以买多少东西。其实和背包的思想是一样的,就是容量为V的背包最多可以装多少东西。

2.分析:这和我们之前说到的01背包和完全背包都是不一样的,因为01背包中物品只有一个,所以就是拿与不拿的问题,完全背包中物品的数量是无限的,所以就是拿多少个的问题,然而在这里似乎综合了这两个问题,物品的数量是任意的(注意:这里的任意指的是一个有限的值,一定不是一个无限的值,否则问题的求解会发生变化)。这种问题我们叫做多重背包。

3.关于多重背包的解法有很多种,我们这里就先看一个DP写法。DP的写法也是有好几种写法,我们就写个最简单的(不是因为我懒,是因为难的不会)。我们知道,在完全背包里,我们没有枚举物品的数量,而是通过改变循环的方向解决了转移的问题。但是这里我们就不能这样做了,显然,最直接的写法就是枚举这些属性。有三个属性就分三次枚举:首先第一层枚举物品的种类(其实仔细的想一下,在01背包中我们的第一层的枚举也是在枚举种类,因为每种物品只有一个)那么显然,第二层我们就应该枚举每一种物品的数量了,第三层当然就是价值了。注意这里就应该是倒着循环!知道了这些,转移的方程就很好写了,几乎和完全背包的没有区别。直接给出代码吧。

#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
using namespace std;
int n, m;
const int N = 300;
int v[N], w[N], num[N];
int dp[N];
#pragma warning(disable:4996)
int main()
{
	int T;
	scanf("%d", &T);
	while (T--)
	{
		scanf("%d%d", &n, &m);
		for (int i = 0; i < m; i++)
		{
			scanf("%d%d%d", &w[i], &v[i], &num[i]);
		}
		memset(dp, 0, sizeof(dp));
		for (int i = 0; i < m; i++)
		{
			for (int j = 1; j <= num[i]; j++)
			{
				for (int k = n; k >= w[i]; k--)
				{
					dp[k] = max(dp[k], dp[k - w[i]] + v[i]);
				}
			}
		}
		printf("%d\n", dp[n]);

	}
}

 

一、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值