0-1背包

【白话算法】从0-1背包到无限制背包,到背包变种。 先上题目: 0-1背包: 给定n个物品,考虑他们的重量 和 价值,分别为   w[0], w[1], w[2], w[3] ... w[n-1] 和  v[0], v[1], v[2], v[3], v[4] ... v[n-1]。 现在有一个载重量为 W 的背包,求这个背包能放入的物品组合的最大价值。(每个物品只有一件)。 物品数量无限制背包: 给定n种物品,考虑各个种类的物品单件的 重量 阅读详情

关于HDU 2602 ,按照算法课上讲的写了一下

二维:

#include <stdio.h>
#include <string.h>

int n,c;

int v[1001];
int w[1001];
int dp[1001][1001];

int max (int a, int b) {
	return (a>b)? a:b;
}

int min(int a, int b) {
	return (a>b)? b:a;
}

void knapsack() {
	memset(dp,0,sizeof(dp));
	int jMax;
	for (int i=0; i<=c; ++i) dp[0][i] = 0;
	for (int i=1; i<n; ++i) {
		jMax = min(w[i]-1, c);
		for (int j=0; j<=jMax; ++j) {
			dp[i][j] = dp[i-1][j];
		}
		for (int j=w[i]; j<=c; ++j) {
			dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);
		}
	}
	dp[n][c] = dp[n-1][c];
	if(c>=w[n]) dp[n][c] = max(dp[n][c], dp[n-1][c-w[n]] + v[n]);
}

int main () {
	int ncase;
	scanf("%d",&ncase);
	while (ncase--) {
		scanf("%d%d", &n, &c);
		for (int i=1; i<=n; ++i) scanf("%d",v+i);
		for (int i=1; i<=n; ++i) scanf("%d",w+i);
		knapsack();
		printf("%d\n",dp[n][c]);
		//for (int i=0; i<=n; ++i) {
		//	for (int j=0; j<=c; ++j) {
		//		printf("%4d ",dp[i][j]);
		//	}
		//	putchar('\n');
		//}
	}
}

其实对于0-1背包。。一维完全可以解决问题:

#include <stdio.h>
#include <string.h>

int n,c;

int v[1001];
int w[1001];
int dp[1001];

int max(int a, int b) {return a>b? a:b;}
int main () {
	int ncase;
	scanf("%d",&ncase);
	while (ncase--) {
		memset(dp,0,sizeof(dp));
		scanf("%d%d", &n, &c);
		for (int i=1; i<=n; ++i) scanf("%d",v+i);
		for (int i=1; i<=n; ++i) scanf("%d",w+i);
		for (int i=1; i<=n; ++i)
			for (int j=c; j>=w[i]; --j) dp[j] = max(dp[j],dp[j-w[i]] + v[i]);
		printf("%d\n",dp[c]);
	}
}


典型的  0-1背包问题  还有HDU 1203

#include <stdio.h>
#include <string.h>

int n,m;

int w[10001];
double v[10001];
double dp[10001];

double min(double a, double b) {
	return a>b? b:a;
}

int main (){
	while (scanf("%d%d",&n,&m),n+m) {
		for (int i=0; i<=n; ++i) dp[i] = 1.0;
		for (int i=1; i<=m; ++i)
			scanf("%d%lf", &w[i], &v[i]);
		for (int i=1; i<=m; ++i) {
			for (int j=n; j>=w[i]; --j) {
				dp[j] = min(dp[j], dp[j-w[i]]*(1.0-v[i]));
			}
		}
		dp[n] = 1.0 - dp[n];
		dp[n] *= 100.0;
		printf("%.1lf%%\n",dp[n]);
	}
}

这题要求至少得到一份的最大概率, 那我们求得不到offer的最小概率即可~  如代码,01背包 dp存最小概率 , 最后用1减,即可




动态规划 之 0-1背包问题 关于背包问题,其实可以分为两种类型:0-1背包问题 和 部分背包问题。 1、先通过一个例子来说明一下二者的区别吧! 有一个窃贼在偷窃一家商店时发现有n件物品,第i件物品价值为vi元,重量为wi,假设vi和wi都为整数。他希望带走的东西越值钱越好,但他的背包中之多只能装下W磅的东西,W为一整数。他应该带走哪几样东西? 0-1背包问题:每件物品或被带走,或被留下,(需要做出0-1选择)。小偷 阅读详情

相关推荐

Python解决0/1背包和完全背包问题

总述: 在解决背包问题前,需要了解的是动态规划的思想,背包问题是最典型的动态规划应用。 一、0/1背包问题 0/1背包的关键在于每个物品都只有两个状态:装和不装。 例如,某0/1背包问题为,n=5,w={2,2,6,5,4},v={6,3,5,4,6},W=10。求背包能装下的最大价值。 分析: 背包的回推过程非常关键,在接下来的实例中会详细阐述。 其中i表示物品序号,r表示...

wondering_cat的博客 1951

背包问题总结【0-1背包、完全背包、排列组合问题】

背包问题

theonepiece的博客 2309

0-1背包+分数背包

题目出自北航ojhttps://buaacoding.cn/contest-ng/index.html#/187/problems B Bamboo&APTX4844魔发药水 时间限制:2000ms   内存限制:65536kb 题目描述 “朋友,你渴望力量吗?” “不渴望谢谢。” “那朋友,你想要浓密的头发吗?” “想。” Bamboo停下脚步望了望角落里的巫师:“你这不是

Code_BaiYE的博客 1158

背包DP问题(0/1背包,完全背包,多重背包,分组背包

背包DP问题0/1背包问题模型状态转移方程完全背包二级目录三级目录多重背包二级目录三级目录分组背包二级目录三级目录 0/1背包 问题模型 给定N个物品,其中第i个物品的体积为Vi,价值为Wi。有一个容积为M的背包。要求放入物品的总体积不超过M的情况下,总价值最高。 状态转移方程 完全背包 二级目录 三级目录 多重背包 二级目录 三级目录 分组背包 二级目录 三级目录 ...

JomQ的博客 1368

背包初步(0-1背包、完全背包

背包初步(0-1背包、完全背包) Charm Bracelet S 检查数组是否存在有效划分 单词拆分 疯狂的采药 自然数拆分

ZZZS0516的博客 857

0-1背包与完全背包的区别

0-1背包 重要部分:每次每个物品最多只能选择一次。 题面:有n个重量和价值分别为 Wi 与 Vi 的物品,现在从这些物品中挑选出总重量不超过 s 的物品,并且要求总价值最大。 输入: n=4 S=5 (w,v) = {(2,3)(1,2)(3,4)(2,2)} 输出: 7(选择0,1,3号物品) 对于这个问题我们可以先用最朴素的方法,判断每个物品是否放入背包中。 #include<...

厄尔尼诺的博客 1555

背包总结——0-1背包及完全背包问题总结及代码模板

背包总结 背包问题通常是多种物品有多个属性,且已知条件为某属性被受限,求另一属性的最大/最小/等于/存在不存在。以0-1背包为例解释:n个物品具有的属性为重量和价值,其中总重量C将重量的属性限制住,求最大价值,即求另一属性的特征。 针对背包问题: 1、先判断属于0-1背包还是完全背包。 2、看是求最大值/最小值/等值/是否存在/排列/组合(排列/组合问题通常出现在完全背包中)。 确定了背包类型及要求的问题后,即可下手做题。 10-1背包 0-1背包是指物品只能使用一次,故通常其状态方程为: dp[i][j

baymax的博客 587

完全背包,0-1背包实战

完全背包,0-1背包实战完全背包原题摘录简要解析0-1背包原题摘录简要解析 完全背包 浅解:就是必须将背包装满 原题摘录 简要解析 显然,这是一个完全背包问题.问题就是挑选物品,把总体积凑成40有多少种凑法?枚举显然不行.因为枚举每个物品选还是不选,有2^20种. 先可以尝试使用递归的思想.递归是很多思想的一个起点.也最容易想到.以及从他出发优化出更好的办法. 把ways(int w,int k...

2020 468

LlamaIndex 系列【18】关键词检索(Keyword Search):TF-IDF 算法

关键词检索(Keyword Search)属于信息检索 技术的基础方法之一,是一种通过输入关键字获取文档信息的查询方式。

记录知识、锤炼自我 787

洛谷 P1421 / P1422 / P1423 小玉三部曲——浮点数的三道关

P1421、P1422、P1423 是洛谷上同一个作者(yeszy)出品的三道入门题,主角都叫小玉,恰好覆盖了浮点数在竞赛入门中的三种典型用法:金额换算与取整、阶梯计费与小数格式化输出、等比递减与浮点累加比较。三道题都不难,但学生最容易踩的坑不是算法,而是浮点数的格式化输出和精度比较。文末延伸讲解 IEEE 754 浮点数存储方式,以及 C++ 中 0.11 - 0.9 为什么不相等的经典问题。

pypypythonni的博客 208

机器人路径规划5大主流算法详解:MPC、强化学习、图搜索等

▲图6 | 多障碍环境中的势场路径比较,每个圆形障碍物周围的紫色环可以理解为这个障碍物产生的“碰撞磁场”,机器人一旦靠近这些“碰撞磁场”就会受到“人工势场的作用力”,从而被排斥远离障碍物。例如,在家庭辅助机器人中,当用户下达“去书房拿杯子”的指令时,系统结合感知算法在地图上锚定家具和物品的位置,为 LLM 提供空间语义锚点。将家具和物品位置锚定到地图后,可以通过LLM在地图中识别用户指定的目标物体的位置,从而获得地图的起点和终点,随后系统再调用传统的路径规划算法,即可高效的解决复杂的视觉-语言-导航问题。

soaring_casia的专栏 529

20,84:有效的括号,柱状图中最大的矩形

这道题目又是一道有严格先后顺序的数据结构,所以我们可以使用栈来轻松解决这类问题。可以将字符串中处于左半部分的元素压入栈中,当遇到右半部分的元素时,我们可以将原来的元素先出栈,在和右半部分的元素进行比对,如果他俩是一对的话,就进行下一个循环,如果不是一对的话,就直接返回false,因为已经违反了规则。

2401_88017330的博客 188

leetcode 3903. 最小稳定下标 I 简单

如果不存在这样的下标,则返回。在下标 0 处,不稳定值为。

2401_88085478的博客 196

排序-堆排序(Heap Sort)

摘要:堆排序是一种基于二叉堆数据结构的原地排序算法,凭借稳定的 O(nlog n) 时间复杂度和 O(1) 的额外空间开销,弥补了冒泡、选择、插入排序在大规模数据下效率低下的短板。本文从堆的底层性质出发,完整讲解堆排序的原理、向上调整、向下调整、建堆逻辑与排序流程,重点剖析「升序建大根堆、降序建小根堆」这一核心口诀的根本原因,并给出可运行的 C++ 代码实现,帮助读者彻底吃透堆排序。

2401_87882972的博客 104

算法论文/数据集3——CLD(TMLR2025)压缩训练集,仅保留对验证集有益的样本

CLD通过计算训练样本与同类验证集在训练过程中损失差分轨迹的Pearson相关性,筛选高相关样本构成coreset。仅依赖逐样本损失标量,无需梯度或特征,具备收敛性理论保证

ZhouDevin的博客 353

为何AI无法多语言交叉共用算法与解决阿雪技术观-东方仙盟

在现代软件开发中,大量项目都面临多终端、多编程语言交互的现实场景:浏览器端 JavaScript、服务端 PHP、后端 Java、移动端 Rust、桌面端 C# 需要共用同一套业务算法,最典型就是跨端加解密、签名校验、数据序列化。很多开发者寄希望 AI 直接生成一套多语言互通的算法代码,直接复制粘贴就能跑通。但实际落地经常出现诡异现象:JS 加密出来的数据,PHP 无法解密;Python 计算的校验哈希,Go 语言校验直接失败。

cybersnow精通 28 门计算机语言,凭借其超凡的技术能力,成功开发过上万个应用,广泛涉及政府、商业、个人等众多领域,甚至在检察院、环保局、公安局等专业场景中也大放异彩。不仅熟练掌握单片机和物联网开发,在软件架构设计方面更是独树一帜,自创了跨平台软件 357

Keccak置换算法的优缺点

Keccak(读作“ketchak”)是一类基于海绵结构(sponge construction) 的密码学哈希函数家族。它于2012年在美国国家标准与技术研究院(NIST)举办的SHA-3竞赛中获胜,后被标准化为SHA-3系列哈希函数以及SHAKE可扩展输出函数。 Keccak置换函数以其厚安全边际、可证明安全性、灵活的参数体系和良好的硬件实现性能成为SHA-3标准的基石。然而,它在纯软件环境下的速度、短消息处理效率以及逆置换效率方面存在一定不足。总体而言,Keccak-f是一个在设计上经过深思熟虑、经过

HuangJinLong2的博客 585

算法30,前缀和,和为k的子数组

✅“以前有没有出现过sum - k?有的话,有几个?每一个出现,都对应一个合法子数组。

sheshibenniaodan的博客 187
上一篇: 【转】Perl的die、warn、eval函数
下一篇: 每日一水~ 2012-4-24 HDU2002 HDU1004
newxbee
博客等级 码龄15年 1粉丝 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值