POJ 1742 Coins ( 经典多重部分和问题 DP || 多重背包 )

题意 : 有 n 种面额的硬币,给出各种面额硬币的数量和和面额数,求最多能搭配出几种不超过 m 的金额?

 

分析 :

这题可用多重背包来解,但这里不讨论这种做法。

如果之前有接触过背包DP的可以自然想到DP数组的定义 ==> dp[i][j] 表示使用前 i 种硬币是否可以凑成面额 j 。

根据这样的定义,则一开始初始化 dp[0][0] = true 最后统计 dp[n][1 ~ m] 为 true 的数量即为答案

状态转移方程为 dp[i][j] |= dp[i-1][ j - k*val[i] ] ( k 表示取 k 个第 i 种硬币、val[i] 表示第 i 种硬币的面额 )

转移方程的意义不难理解,需要考虑当前的 dp[i][j] 可以从哪些状态转移而来,如下

使用第 i 种硬币刚好凑成 j 的值应当为上个状态( dp[i-1][] )合法的 j-val[i]、j-2*val[i]、j-3*val[i]....

故代码应当为一个如下所示的三重循环,但是复杂度较高无法通过这题.....

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn = 111;bool dp[maxn][100005];
int num[maxn], val[maxn];int main(void)
{int N, C;while(~scanf("%d %d", &N, &C) && !(N==0 && C==0)){for(int i=1; i<=N; i++) scanf("%d", &val[i]);for(int i=1; i<=N; i++) scanf("%d", &num[i]);memset(dp, false, sizeof(dp));dp[0][0] = true;for(int i=1; i<=N; i++){for(int j=0; j<=C; j++){for(int k=0; k<=num[i] && k*val[i]<=j; k++){dp[i][j] |= dp[i-1][j-k*val[i]];}}}printf("%d\n", count(dp[N]+1, dp[N]+C+1, true));}return 0;
}
View Code

 

通常使用 dp 数组只记录布尔值是种浪费的做法,一般就去考虑在保证正确性的情况下改变 dp 含义记录更多信息去降低复杂度!

现将 dp 含义改变为 ==> dp[i][j] 表示用前 i 种硬币凑成 j 时第 i 种硬币最多还可以剩多少

挑战书上是直接给出了定义,但是我更乐于探寻这玩意是什么来的? 注:以下都是我自己的想法

想想上面的解法,好像会发现其实如果我当前考虑过 dp[i][j] = true 了,那么 dp[i][j+val[i]]、dp[i][j+2*val[i]]、dp[i][j+3*val[i]]... 应该都为 true 

而枚举 j 的顺序也恰好是从小到大,所以必定会枚举到 dp[i][j+val[i]]、dp[i][j+2*val[i]]...,所以何不写成如下这样

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

运行了样例之后发现这样的做法得出的答案比标准答案更大!为什么?因为这样的做法没有考虑到数量,一种硬币的数量是有限的

所以当 j+k*val[i] 的 k 超过了规定数量的时候就会发生错误,使得一些本该为 false 的 dp 数组值变成了 true,所以我们需要记录数量!

复杂度为 O(n*m) 在 POJ 上跑了 2016MS

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn = 111;int dp[100005];
int num[maxn], val[maxn];bool fun(int x)
{ if(x>=0) return true; return false; }int main(void)
{int N, C;while(~scanf("%d %d", &N, &C) && !(N==0 && C==0)){for(int i=1; i<=N; i++) scanf("%d", &val[i]);for(int i=1; i<=N; i++) scanf("%d", &num[i]);memset(dp, -1, sizeof(dp));dp[0] = 0;for(int i=1; i<=N; i++){for(int j=0; j<=C; j++){if(dp[j] >= 0) dp[j] = num[i];else if(j < val[i] || dp[j-val[i]] <= 0) dp[j] = -1;else dp[j] = dp[j-val[i]] - 1;}}printf("%d\n", count_if(dp+1, dp+1+C, fun));}return 0;
}
View Code

 

转载于:https://www.cnblogs.com/LiHior/p/8053149.html

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

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

相关文章

css用hover制作下拉菜单

首先我们的需求就是 制作一个鼠标移动到某个区域就会有下拉菜单的弹出,这样会有更多的子类内容,示例代码如下: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>*{mar…

mysql 字典索引_【大白话mysql】你真的了解 mysql 索引吗?

本文来源于公众号&#xff1a; 跬步匠心什么是索引&#xff1f;当我们使用汉语字典查找某个字时&#xff0c;我们会先通过拼音目录查到那个字所在的页码&#xff0c;然后直接翻到字典的那一页&#xff0c;找到我们要查的字&#xff0c;通过拼音目录查找比我们拿起字典从头一页一…

mysql使用jtable_jtable 的简单使用

做后台管理管理系统时&#xff0c;基于ajax的数据操作和富有表现力的数据绑定插件jtable绝对是一个不错的选择&#xff0c;他接收来自服务器端的json格式的数据。而且他是一款开源的基于jquery和jquery ui的插件&#xff0c;您可以根据自己的需要修改其表现&#xff0c;如css&a…

java自定义菜单跳转页面_微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解...

微信公众号开发 自定义菜单请先读完本文再进行配置开发请先前往微信平台开发者文档阅读“网页授权获取用户基本信息”的接口说明在微信公众账号开发中&#xff0c;往往有定义一个菜单&#xff0c;然后用户点击该菜单就进入用户个人中心的功能&#xff0c;通常应用于各个公众账号…

贝叶斯理论基础理解

从贝叶斯方法谈到贝叶斯网络&#xff1a; http://blog.csdn.net/zdy0_2004/article/details/41096141 1 思考模式 比如往台球桌上扔一个球&#xff0c;这个球落会落在何处呢&#xff1f;如果是不偏不倚的把球抛出去&#xff0c;那么此球落在台球桌上的任一位置都有着相同的机…

C++如何实现DNS域名解析转

C如何实现DNS域名解析 这片文章介绍了C如何实现DNS域名解析&#xff0c;还有对相关技术的介绍&#xff0c;代码很详细,需要的朋友可以参考下一、概述 现在来搞定DNS域名解析&#xff0c;其实这是前面一篇文章C实现Ping里面的遗留问题&#xff0c;要干的活是ping的过程中画红线的…

高等代数第3版下 [丘维声 著] 2015年版_2020年成人高考 专升本 高等数学复习攻略...

成人高考的高等数学考试按照专业属性分为理工类和经管类&#xff0c;高等数学一直是成考中的比较不好拿分的科目&#xff0c;也是大家复习备考的难点。今天&#xff0c;小编给大家分享一些答题技巧和必备的公式&#xff0c;帮助大家一起来搞定高等数学&#xff0c;希望这份资料…

java虚拟机10.内存模型与线程

多任务处理在现代计算机操作系统中是一项必备的功能&#xff0c;让计算机同时去做几件事情&#xff0c;不仅是因为计算机的运算能力强大了&#xff0c;更重要的原因是计算机的运算速度与它的存储和通信子系统速度的差距太大&#xff0c;大量的时间都花费在磁盘I/O&#xff0c;网…

php仿微信上传图片压缩,PHP仿微信多图片预览上传实例代码

生产图片区域&#xff0c;上传按钮#btn可替换自己想要的图片plupload上传var uploader new plupload.Uploader({//创建实例的构造方法runtimes: html5,flash,silverlight,html4, //上传插件初始化选用那种方式的优先级顺序browse_button: btn, // 上传按钮url: "ajax.php…

笔记本电脑如何保养_嘉兴专业笔记本电脑喷漆加工厂价格实惠

嘉兴专业笔记本电脑喷漆加工厂价格实惠 [xznugcbx]不宜大量储存或久存&#xff0c;做好通风设施。自喷漆如果大量泄露操作人员应迅速撤离泄露污染区人员到安全区域&#xff0c;因罐内的二甲醚气体具有轻微的毒性&#xff0c;并将污染区域进行隔离&#xff0c;罐内的气体跟空气中…

css 滤镜之AlphaImageLoader

CreateTime--2017年12月25日17:05:37 Author:Marydon ie滤镜特效之AlphaImageLoader 作用&#xff1a; 用于设置背景图片特效样式 使用条件&#xff1a; IE8及以下版本不支持属性background-size&#xff0c;可以使用AlphaImageLoader来代替 语法&#xff1a; filter : progid:…

企业是否应该实现对客户需求的快速响应_互联网企业的数据化迭代和数据化应用...

数字时代&#xff0c;品牌和消费者正经历数字化的变革&#xff0c;谁能真正实现企业数据赋能&#xff0c;谁就是残酷市场竞争下的优胜者。企业需要加快实现全数据治理工具的研发&#xff0c;用数据推动企业发展。本文作者结合案例分享了关于企业数字化的方法论与感知响应模型&a…

windows server 触屏_宜昌触屏万能蒸烤箱价格-华春新能源有限公司

首页 > 新闻列表 > 浏览文章发布时间&#xff1a;2020-10-27 08:47:06 浏览量&#xff1a; 5导读&#xff1a;华春新能源有限公司为您提供宜昌触屏万能蒸烤箱价格的相关知识与详情&#xff1a; 所述水箱与水较少时的水位达到一个比预定热气体电磁阀被打开时系统压力平衡…

3ds Max制作碗实例教程

一、 碗的建模。模型的结果如图WB—1所示&#xff1a; 图WB—1 1. 创建圆柱&#xff0c;并调节参数&#xff0c;转换到多边形&#xff0c;最终的结果图WB—2所示&#xff1a; 图WB—2 2.使用Inset&#xff08;插入&#xff09;插入一个面&#xff0c;再次执行Extrude&#xff0…

unity hub服务器无响应_累积更新KB4541335反馈称无法安装 出现无响应情况

几天前微软面向Windows 10 Version 1903/Version 1909功能更新&#xff0c;发布了累积更新KB4541335&#xff0c;主要改善了开始菜单和文件管理器。不过部分用户在Feedback Hub上反馈无法安装该更新&#xff0c;过程中会收到错误信息。用户反馈称会收到“2020-03 Cumulative Up…

电脑二维码怎么扫描_扫描模组方案是如何满足多种应用场景需求?

随着自动识别技术的发展&#xff0c;扫描模组逐渐成为各个领域上的配套&#xff0c;然而很多人还停留在“主扫”的观念上&#xff0c;殊不知如今的“被扫”更受人们的欢迎&#xff0c;即采用硬件解码的方式去识读条形码或二维码。远景达作为扫描模组方案公司&#xff0c;在不断…

cad刷新快捷键_第16期分享:常用电脑快捷键是哪些?

电脑键盘快捷键的使用能很好的提高工作效率&#xff0c;所谓的快捷键就是使用键盘上某一个或某几个键的组合完成一条功能命令&#xff0c;从而达到提高操作速度的目的。善于使用快捷键能更快捷的使用电脑&#xff0c;那么电脑键盘快捷键有哪些呢?下面小编就来详细介绍一下常用…

ALSA声卡12_从零编写之添加音量控制_学习笔记

1、设置音量时应用程序的调用过程 &#xff08;1&#xff09;strace分析&#xff1a; amixer cset numid1 30 (设置音量) /dev/snd/controlC0 open SNDRV_CTL_IOCTL_CARD_INFO SNDRV_CTL_IOCTL_PVERSION SNDRV_CTL_IOCTL_ELEM_INFO SNDRV_CTL_IOCTL_ELEM_READSNDRV_CTL_IOCTL_E…

twrp3.3.0刷n9002_插画师必备笔刷,送你5套iPad5.0新出300款大神笔刷

由于插画行业的蒸蒸日上&#xff0c;人们对于插画的喜爱程度也大大提高。本身由于插画的趣味性&#xff0c;因此插画成为了不论在男女老幼之间都十分受欢迎的存在。尤其是目前来说最受欢迎之一的iPad插画绘制设计&#xff0c;相信很多在做的同学都有过想要学习插画设计的冲动&a…

恒压板框过滤实验数据处理_高考化学实验中:那些不常见的【特殊仪器】与装置,难得的资料...

高考化学实验试题中有时会涉及到一些不常见的仪器装置&#xff0c;增大了试题分析解答的难度。学长现将一些特殊仪器与装置都一一整理出来&#xff0c;供小伙伴们参考学习&#xff0c;以后试题中再见到它们就再也不怕啦&#xff01;1&#xff0e;三颈烧瓶&#xff08;三颈烧瓶&…