每日练习之完全背包——兑换零钱,完全背包问题总结

news2024/11/24 15:24:06

兑换零钱

题目描述

运行代码

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
const int mod=1e9+7;
int a[20]={1,2,5,10,20,50,100,200,500,1000,2000,5000,10000},dp[100010];
int main()
{
	dp[0]=1;
	for(int i=0;i<13;i++)
        for(int j=a[i];j<=100000;j++)
            dp[j]=(dp[j]+dp[j-a[i]])%mod;
	int N,T;
	cin>>T;
	while( T-- )
	{
		cin>>N;
		cout<<dp[N]<<endl;
	}
	 return 0;
}

代码思路

  1. 初始化dp[0]为1,因为凑成面额0只有一种方式(即不使用任何硬币)。
  2. 使用两个嵌套的循环来计算dp数组的其他元素。外层循环遍历硬币数组a,内层循环遍历从当前硬币面额到100000的所有可能面额。对于每个面额j,我们都检查是否可以使用当前硬币a[i]来凑成它。如果可以(即j >= a[i]),则dp[j]的值是原来的值加上dp[j-a[i]](即不使用当前硬币和使用当前硬币的凑法数之和)。
  3. 最后,程序读取测试用例数量T,然后对每个测试用例读取一个整数N,并输出dp[N],即凑成面额N的方法数。

改进建议

  1. 避免使用<bits/stdc++.h>:这个头文件虽然包含了几乎所有标准库,但它不是标准C++的一部分,而且会增加编译时间。建议只包含你需要的头文件。
  2. 数组大小:虽然这里定义dp数组的大小为100010是足够的,但如果你想要一个更通用的解决方案,你可以根据输入的最大可能值来动态分配这个数组的大小。
  3. 输入验证:虽然在这个问题中可能不需要,但在实际应用中,验证输入的有效性(例如,确保N是非负的)是一个好习惯。
  4. 注释:添加注释来解释代码的每个部分是如何工作的,以及为什么选择这种特定的实现方式,可以帮助其他人(或未来的你)更容易地理解代码。
  5. 优化:虽然对于这个问题来说,当前的实现已经足够快,但如果你在处理更大的面额或更多的硬币时,你可能需要考虑更高效的算法,如使用背包问题的优化技术。

改进代码

#include <iostream>  
#include <vector>  
using namespace std;  
const int MOD = 1e9 + 7;  
const int MAX = 100000; 
vector<int> coin = {1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000};  
// 动态规划表,用于存储凑成不同面额的方法数  
vector<int> Amount(MAX + 1, 0);  
int main() {  
    // 初始化凑成面额0的方法数为1  
   Amount[0] = 1;   
    // 动态规划计算凑成不同面额的方法数  
    for (int i = 0; i < coin.size(); i++) {  
        for (int j = coin[i]; j <= MAX; j++) {  
            Amount[j] = (Amount[j] + Amount[j - coin[i]]) % MOD;  
        }  
    }  
    int T, N;  
    cin >> T; // 读取测试用例数量   
    while (T--) {  
        cin >> N; // 读取当前测试用例的面额  
        cout <<Amount[N] << endl; // 输出凑成面额N的方法数  
    }   
    return 0;  
}

完全背包问题

完全背包问题是一个经典的动态规划问题,其特点在于每种物品都有无限个,可以选择放入背包中的数量不受限制。

总结
  1. 问题描述:给定N种物品和一个容量为W的背包,每种物品都有无限个可用,每种物品的重量是weight[i],价值是value[i]。求解将哪些物品装入背包,可以使得装入背包的物品总价值最大,且不超过背包的容量限制。
  2. 状态定义:设dp[i][j]表示前i种物品,在背包容量为j的情况下所能获得的最大价值。或者,也可以使用一维数组dp[j],其中dp[j]表示背包容量为j时的最大价值。
  3. 状态转移方程:对于一维数组的情况,状态转移方程为dp[j] = max(dp[j], dp[j - weight[i]] + value[i]),其中i表示当前考虑的物品,j表示当前背包的容量。这个方程表示,对于第i种物品,可以选择放入或不放入背包,取两种情况下的价值较大者作为当前背包容量的最大价值。
注意事项
  • 初始化:在动态规划问题中,初始化的设置非常关键。对于完全背包问题,通常需要将dp数组初始化为0,表示没有任何物品放入背包时的价值为0。
  • 遍历顺序:与01背包问题不同,完全背包问题在遍历背包容量时可以从前往后遍历,因为每种物品都可以选择放入多个。而在01背包问题中,为了避免重复计算,需要从后往前遍历背包容量。
  • 空间优化:在实际编程中,为了节省空间,可以使用一维数组代替二维数组进行状态转移。但是需要注意,由于完全背包问题中每种物品都可以选择放入多个,因此在遍历背包容量时,内部循环应该是从前往后遍历。
  • 避免重复计算:在编写代码时,要注意避免重复计算。例如,在遍历过程中,对于同一种物品,如果已经计算过在某种背包容量下的最大价值,那么就不需要再次计算。
  • 边界条件处理:在处理边界条件时,要特别小心。例如,当背包容量为0时,无论放入何种物品,其价值都应为0;当物品重量超过背包容量时,该物品无法放入背包。这些情况都需要在代码中妥善处理。
  • 理解问题背景:在解决完全背包问题时,要深入理解问题的背景和要求。例如,有些问题可能要求输出具体的装入方案,而不仅仅是最大价值。在这种情况下,需要在代码中记录装入方案的相关信息。

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

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

相关文章

汇聚荣:新手做拼多多应该注意哪些事项?

新手在拼多多开店&#xff0c;面临的是竞争激烈的市场和复杂的运营规则。要想在这个平台上脱颖而出&#xff0c;必须注意以下几个关键事项。 一、市场调研与定位 深入了解市场需求和竞争对手情况是新手开店的首要步骤。选择有潜力的细分市场&#xff0c;并针对目标消费者群体进…

LaTeX 2022软件安装教程(附软件下载地址)

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; LaTeX 2022是基于ΤΕΧ的一种排版系统&#xff0c;特别适用于生成科技和数学文档的高质量打印。它可用于各种文档类型&#xff0c;从简单信函到完整…

【Flutter】线性布局弹性布局层叠布局

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Flutter学习 &#x1f320; 首发时间&#xff1a;2024年5月25日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…

如何修改WordPress网站的域名

我的网站用的是Hostease的虚拟主机&#xff0c;但是域名是之前在其他平台买的&#xff0c;而且已经快到期了&#xff0c;因为主机和域名在不同的平台上&#xff0c;管理不太方便&#xff0c;所以我又在Hostease重新注册了一个域名&#xff0c;然后把网站换成了新的域名&#xf…

【AJAX前端框架】Asynchronous Javascript And Xml

1 传统请求及缺点 传统的请求都有哪些&#xff1f; 直接在浏览器地址栏上输入URL。点击超链接提交form表单使用JS代码发送请求 window.open(url)document.location.href urlwindow.location.href url… 传统请求存在的问题 页面全部刷新导致了用户的体验较差。传统的请求导…

集中抄表电表是什么?

1.集中抄表电表&#xff1a;简述 集中抄表电表&#xff0c;又称为远程抄表系统&#xff0c;是一种现代化电力计量技术&#xff0c;为提升电力行业的经营效率和客户服务质量。它通过自动化的形式&#xff0c;取代了传统人工抄水表&#xff0c;完成了数据信息实时、精确、高效率…

小程序丨公告栏功能,自动弹出提醒

发布查询时&#xff0c;您是否遇到这样的困扰&#xff1a; 1、查询发布时间未到&#xff0c;学生进入查询主页后发现未发布任何查询&#xff0c;不断咨询原因。 2、有些重要事项需要进入查询主页就进行强提醒&#xff0c;确保人人可见&#xff0c;用户需要反馈“我知道了”才…

《拯救大学生课设不挂科第二期之Windows11下安装VC6.0(VC++6.0)与跑通Hello,World!程序教程》【官方笔记】

背景与目标人群&#xff1a; 大学第一次学C语言的时候&#xff0c;大部分老师会选择VC6这个编辑器。 但由于很多人是新手&#xff0c;第一次上大学学C语言。 老师要求VC6.0&#xff08;VC6.0&#xff09;写C语言跑程序可能很多人还是第一次接触电脑。 需要安装VC6这个编辑器…

如何零基础快速制作商业画册?这篇攻略帮你搞定

随着社会经济的发展&#xff0c;商业画册作为企业形象和产品介绍的重要载体&#xff0c;越来越受到重视。然而&#xff0c;很多企业和个人由于没有设计背景&#xff0c;在面对制作商业画册时往往感到困惑。本文将为你介绍零基础快速制作商业画册的攻略&#xff0c;让你轻松搞定…

嵌入式实时操作系统笔记1:RTOS入门_理解简单的OS系统

今日开始学习嵌入式实时操作系统RTOS&#xff1a;UCOS-III实时操作系统 本次目标是入门RTOS&#xff0c;理解多任务系统...... 本文只是个人学习笔记&#xff0c;基本都是对网上资料的整合...... 目录 STM32裸机与RTOS区别&#xff1a; 裸机中断示例&#xff1a; RTOS对优先级…

C语言 数组——数组的定义和初始化

目录 为什么使用数组(Array)? 一维数组的定义 一维数组的初始化 一维数组元素的访问 一维数组元素的赋值 数组的逻辑存储结构 数组的物理存储结构 二维数组的定义和初始化 为什么使用数组(Array)? 一维数组的定义 一维 数组的定义 int a[10]; 定义一个有 10 个 int 型元素的…

C++ 网络编程

一、Reactor 网络编程模型 reactor 是一个事件处理模型。网络处理:因为用户层并不知道 IO 什么时候就绪,所以将对 IO 的处理转化为对事件的处理。网络模型构成: 非阻塞 IO:操作 IO,如果 IO 未就绪,IO 函数会立刻返回。IO 多路复用:检测多路 IO 是否就绪。工作流程: 注册…

一文了解 FileBeat:诞生背景、发展历程与定义

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《洞察之眼&#xff1a;ELK监控与可视化》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是ELK 2、FileBeat在ELK中的角色 3、File…

C++的数据结构(十八):并查集

并查集&#xff08;Union-Find&#xff09;是一种用于处理一些不交集&#xff08;Disjoint Sets&#xff09;问题的数据结构。它主要支持两种操作&#xff1a;合并集合&#xff08;Union&#xff09;和查找元素所属集合&#xff08;Find&#xff09;。在解决诸如连通性问题、网…

在XP/Vista系统下使用Node.js的babel-cli命令行工具转码ES6语法的js文件,让IE8浏览器也能运行

在XP系统下IE浏览器最高只能装到IE8&#xff0c;在Vista系统下最高只能装到IE9。 2015年以后&#xff0c;JavaScript新增了很多语法&#xff0c;比如class、extends&#xff0c;还有let和const等等&#xff0c;这些语法都是XP下的终端浏览器IE8所不支持的。要想让使用了这些新式…

[集群聊天服务器]----(五)User类、UserModel类

接着上文[集群聊天服务器]----(四)MySQL数据库模块&#xff0c;接下来我们对User类、UserModel类进行剖析&#xff0c;User表和UserModel类是项目最基本也是最重要的部分&#xff0c;通过它我们对用户的id&#xff0c;用户名&#xff0c;密码&#xff0c;状态相关信息进行存储&…

VSCode运行CMake教程

参考视频&#xff1a; https://www.youtube.com/watch?vm9HBM1m_EMU 首先下载&安装opencv包以及cmake包 接着配置环境变量 点击环境变量 ---下面系统变量的path 找对应路径 添加后三个: 确定即可 接着创建空目录 右击vscode打开 扩展中安装 c tools、cmake、cmake too…

华为芯片与系统详细梳理--Kirin麒麟 Ascend昇腾 Kunpeng鲲鹏 HarmonyOS鸿蒙 Euler欧拉

华为芯片与系统详细梳理--Kirin麒麟 & Ascend昇腾 & Kunpeng鲲鹏 & HarmonyOS鸿蒙 & Euler欧拉 1 概述2 芯片2.1 整体描述麒麟芯片&#xff08;To C&#xff09;【面向智能终端】昇腾芯片【面向AI计算】鲲鹏芯片【面向通用计算】 2.2 细分系列麒麟芯片&#xf…

基于UDP的tftp的文件传输

#define SER_PORT 69 #define SER_IP "192.168.125.71" #define CLT_PORT 6666 #define CLT_IP "192.168.125.158" int main(int argc, const char *argv[]) {//创建套接字文件描述符int cfd socket(AF_INET,SOCK_DGRAM,0);if(cfd -1){perror("sock…

Hadoop3:HDFS的Fsimage和Edits文件介绍

一、概念 Fsimage文件&#xff1a;HDFS文件系统元数据的一个永久性的检查点&#xff0c;其中包含HDFS文件系统的所有目 录和文件inode的序列化信息。 Edits文件&#xff1a;存放HDFS文件系统的所有更新操作的路径&#xff0c;文件系统客户端执行的所有写操作首先 会被记录到Ed…