可行性判定(c++)

可行性判定

当前有 N 件物品和一个容积为 V 的背包。

已知第 i 件物品的体积是 ci​,每种物品有且仅有一件,每一件物品能够选择放或者不放入背包。

现在我们不考虑物品的价值,只关心是否能够取出若干个物品,恰好使这个背包被装满。

也就是说,现在我们需要选出若干件物品,使它们的体积之和 恰好为 V 。

dp 数组初始化

普通的 01 背包中要求放入物品的体积之和不超过 V,而现在我们需要使体积之和恰好为 V。

因为结果只需要输出 V 这个体积是否能被组出,因此我们可以将 dp 数组定义成bool类型。

  • 令 dp[i][j] 表示前  i 个物品中取出若干个物品体积之和为 j 的可行性,当可行的时候 dp[i][j] 等于 11,否则等于 00。
  • 在最开始背包里空空如也的时候,背包里物品的体积之和(没有物品)为 00,所以 00 这个状态在开始就是合法的。
  • 当要求选出物品体积之和恰好为 V 的条件下,唯一可行的转移路线是从 dp[0][0]→dp[N][V],即dp[0][0] 是唯一可行的起点。
  • 所以应当先将整个dp数组初始化为 00 ,再将 [0][0]dp[0][0] 修改为 11 。

核心代码

dp[0][0] = 1; // 初始化开始时唯一的合法状态
for (int i = 1; i <= N; i++) {for (int j = 0; j <= V; j++) {if (j < c[i]) { // 如果容积小于当前物品的体积dp[i][j] = dp[i - 1][j]; // 直接从上一层转移} else if (dp[i - 1][j] || dp[i - 1][j - c[i]]){// 如果前 i - 1 个物品已经能凑出体积之和为 j// 或者前 i - 1 个物品已经能凑出体积之和为 j - c[i] , 那个当前物品加入可以使体积之和变为 jdp[i][j] = 1; // 此时前 i 个物品能够凑出体积之和为 j}}
}

时间复杂度为 O(NV),空间复杂度为 O(NV)。

空间优化:

dp[0] = 1;
for (int i = 1; i <= N; i++) {for (int j = V; j >= c[i]; j--) {dp[j] |= dp[j - c[i]];}
}

完整代码:

#include <iostream>
using namespace std;bool dp[110][1010];
int c[110];int main() {int N, V;cin >> N >> V;for (int i = 1; i <= N; i++) {cin >> c[i];}dp[0][0] = 1;for(int i = 1; i <= N; i++){for(int j = 0; j <= V; j++){if (j < c[i]){dp[i][j] = dp[i - 1][j];} else if (dp[i - 1][j] || dp[i - 1][j - c[i]]){dp[i][j] = 1;}}}if (dp[N][V]){cout << "Yes" << endl;} else {cout << "No" << endl;}return 0;
}

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

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

相关文章

Adobe Animate 2024软件下载

Adobe Animate 2024软件下载&#xff1a; 百度网盘下载https://pan.baidu.com/s/1cQQCFL16OUY1G6uQWgDbSg?pwdSIMS Adobe Animate 2024&#xff0c;作为Flash技术的进化顶点&#xff0c;是Adobe匠心打造的动画与交互内容创作的旗舰软件。这款工具赋予设计师与开发者前所未有的…

day05-面向对象内存原理和数组

day05 面向对象内存原理和数组 我们在之前已经学习过创建对象了,那么在底层中他是如何运行的。 1.对象内存图 1.1 Java 内存分配 Java 程序在运行时&#xff0c;需要在内存中分配空间。为了提高运算效率&#xff0c;就对空间进行了不同区域的划分&#xff0c;因为每一片区域…

Redis的数据完全是存在内存中的吗?

是的&#xff0c;Redis的数据完全是存储在内存中的。这也是Redis能够提供非常高速的读写性能的主要原因&#xff0c;尤其适用于需要快速响应的应用场景。然而&#xff0c;虽然Redis将所有数据存储在内存中&#xff0c;但它也提供了持久化机制&#xff0c;可以将数据异步地保存到…

【LeetCode算法】242. 有效的字母异位词

提示&#xff1a;此文章仅作为本人记录日常学习使用&#xff0c;若有存在错误或者不严谨得地方欢迎指正。 文章目录 一、题目二、思路三、解决方案 一、题目 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每…

docker搭建redis6.0(docker rundocker compose演示)

文章讲了&#xff1a;docker下搭建redis6.0.20遇到一些问题&#xff0c;以及解决后的最佳实践方案 文章实现了&#xff1a; docker run搭建redisdocker compose搭建redis 搭建一个redis’的过程中遇到很多问题&#xff0c;先简单说一下搭建的顺序 找一个redis.conf文件&…

当代 Qt 正确的 安装方法 及 多版本切换

此文写于 20240511 首先去网站Index of /official_releases/online_installers下载一个安装器 安装器有什么用? 可以浏览安装版本 安装组件 安装器版本越能 能装的东西越多 现在只能选Qt5 和 Qt6 至于你公司用的Qt4 我也没招 见招时再拆招 安装器 默认国外源 可以换国内…

C# 不用lock写一个多线程程序

多线程并发 当一段代码有可能被不止一个线程同时访问时&#xff0c;且存在共享资源(变量、文件句柄等)&#xff0c;可能出现并发冲突。发生并发冲突时如果不加锁&#xff0c;程序的行为是不可预测的。而加锁本身又是一件麻烦事&#xff0c;弄不好会出现死锁&#xff0c;死锁时程…

嵌入式全栈开发学习笔记---C语言笔试复习大全15

目录 指针运算 笔试题17 思考&#xff1a;*px、*px和(*px)的区别&#xff01; 笔试题18 补充命令8&#xff1a;“cd ..”退回到上一级目录 补充命令9&#xff1a;“man 3 函数名”可以查看库函数的原型 const 修饰指针是什么意思&#xff1f;&#xff08;笔试重点&#…

浅谈var let const

浅谈var let const var 在ES5中&#xff0c;顶层对象的属性和全局变量是等价的&#xff0c;用var声明的变量既是全局变量&#xff0c;也是顶层变量 var a 10; console.log(window.a) // 10使用var声明的变量存在变量提升的情况 console.log(a) // undefined var a 20// 编…

【C++语言】模板

当谈到C中的模板时&#xff0c;我们在谈论一种强大的工具&#xff0c;它允许程序员编写通用的代码&#xff0c;而不必为特定类型编写多个版本。模板使得编写可重用和灵活的代码变得更加容易&#xff0c;因为它们允许您编写与任何数据类型一起使用的通用算法和数据结构。 什么是…

C++入门指南(上)

目录 ​编辑 一、祖师爷画像 二、什么是C 三、C发展史 四、C在工作领域的应用 1. 操作系统以及大型系统软件开发 2. 服务器端开发 3. 游戏开发 4. 嵌入式和物联网领域 5. 数字图像处理 6. 人工智能 7. 分布式应用 五、如何快速上手C 一、祖师爷画像 本贾尼斯特劳斯…

第二届“盘古石杯”全国电子数据取证大赛wp

服务器取证 先对网站进行重构 [rootstudy ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 643626ab3d8b mattermost/mattermost-pre…

Linux部署

先把需要的东西准备好&#xff1a; 第一步解压tomcat&#xff1a; tar -zxvf apache-tomcat-8.5.20.tar.gz 第二步解压jdk: tar -zxvf jdk-8u151-linux-x64.tar.gz 第三步配置Java环境变量&#xff1a; vim /etc/profile 把下面代码放进去&#xff1a; export JAVA_HOME/root…

dell服务器安装ubuntu18.04桌面版教程

目录 一、制作U盘启动盘 1.镜像下载地址&#xff1a; 2.制作U盘启动盘 二、服务器进入bios一系列设置 1.插入U盘启动盘 2.开机过程按F11键&#xff0c;进入Boot Manager &#xff0c;点击 3.点击点击One-shot BIOS Boot Menu 4.进入boot menu ,找到U盘&#xff08;一般…

react18【系列实用教程】useContext —— Context 机制实现越层组件传值 (2024最新版)

什么是 Context 机制&#xff1f; Context 机制是 react 实现外层组件向内层组件传值的一种方案&#xff0c;父组件可以向其内部的任一组件传值&#xff0c;无论是子组件还是孙组件或更深层次的组件。 实现步骤 1.使用createContext方法创建一个上下文对象 Ctx 2.在顶层组件中通…

基于springboot的校园闲置物品交易系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的校园闲置物品交易系统,…

云南区块链商户平台:抓包技术自制开票工具(三)

前言 上节我们将登录的流程梳理完毕了&#xff0c;来到了本章重点&#xff0c;既然开发票就肯定要有以下参数&#xff1a; 原工具不支持识别历史记录&#xff0c;对于我们的小商店来说&#xff0c;开票的公司基本就是固定的几个&#xff0c;如果提供下拉支持选择将会大大降低…

Java高并发场景(银行转账问题)

最近面试问到了银行转账的高并发问题&#xff0c;回答的不是很理想&#xff0c;小编整理了下&#xff0c;题目大概如下&#xff1a; 有一张银行账号表&#xff08;银行账号字段、金额字段&#xff09;&#xff0c;A账号要给B账号转账&#xff0c;A扣款&#xff0c;B收款&#x…

牛客_非技术快速入门_题目总结

牛客_非技术快速入门_题目总结 SQL29 计算用户的平均次日留存率 描述 题目&#xff1a;现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。 示例&#xff1a;question_practice_detail id device_id quest_id result date 1 2138 111 wron…

@Transaction注解详情解释

概念&#xff1a; Transactional注解是Spring框架提供的一个用于声明式事务管理的注解&#xff0c;方便我们管理事务&#xff0c;保证数据的一致性与可靠性。 事务4个基本特性&#xff1a; 原子性&#xff1a;一个事务要不全部&#xff08;sql&#xff09;执行&#xff1b;要不…