HDU 2844Coins(涉及包含三种背包问题)

杭电的acm的猜数字题目 刚做的这个题目,感觉还不错,想求个猜数字的题目,1175的 立即下载

题意:

给你n种面值分别为A1,A2,A3………..An的硬币,每种硬币对应的数量分别是C1,C2,C3………Cn。问:在可以凑出多少种不同的面值,凑出来的面值必须在1~m之间。

解题思路:

乍一看以为是母函数问题,但的确可以使用母函数(在不顾时间的情况下也可以得出正确答案),由于题目所给的数值太大,m <= 100000,而硬币数量Ci <= 1000。这套用母函数简直就被炸飞了。最终还得老老实实用动态规划。
乍二看,这不是多重背包问题吗,直接三个for循环干上去,很悲剧,肯定超时,数据这么大,两个for循环都有可能崩,更别说三个了。
最终还是弱弱的参考了大神们的代码,发现这道题虽然套着多重背包的羊皮,但其实却需用到01背包与完全背包的概念才能在不超时的情况下跑过。
这里安利一个讲述完全背包的博客:http://blog.youkuaiyun.com/insistgogo/article/details/11081025
感觉讲的超级棒!!!

真正的解题思路:

首先需要用到的第一个技巧便是多重背包问题的二进制优化,使其转变成01背包问题,减少一重循环(如果不明白二进制优化的可以看看我的背包问题2)

第二个技巧:当Ai * Ci >= m时,就没必要再使用二进制优化了,此时可以直接把这种面值的硬币当成无限多个,直接上完全背包的模板。如果优化成二进制比不优化还慢。
第三个技巧:采用滚动数组,由于n*m的最大值为10000000,此处博主怂,不敢开二维怕崩,所以就采用一维。。。。不知有没有壮士开二维过了。
完全背包的状态转移方程:
d[i] = max(d[i],d[i-an]+an); //an代表硬币面值,i代表凑得总钱数。
注意这里的循环是从,i = an 到 i = sum。(why?见上面链接)

01背包的状态转移方程:
d[i] = max(d[i],d[i-an]+an);

具体代码:

#include <set>
#include <numeric>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cctype>
#include <string>
#include <sstream>
#include <map>
#include <functional>

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
#define REP(idx1,num1) for(int idx1=0;idx1<(num1);idx1++)
#define pb push_back
#define empb emplace_back
#define mp make_pair
#define mem(s) memset(s,0,sizeof(s));
const double EPS = 1e-6;
const int maxn = 100000 + 10;
int n,m;
int a[110],c[110];
int d[maxn];
int sum = 0;
//完全背包
//an对应着硬币面值,cnt对应着此面值的硬币个数
void completebag(int an){
    for(int i = an; i <= sum; ++i)
        d[i] = max(d[i],d[i-an]+an);
}
//01背包
void zeroonebag(int an){
    for(int i = sum; i >= an; --i)
        d[i] = max(d[i],d[i-an]+an);
}
//二进制优化
void change(int an,int cnt){
    if(an*cnt >= m){
        completebag(an);
        return;
    }
    else{
        int tmp = 0;
        for(int j = 1; ; j *= 2){
            if(cnt > j){
                tmp = an * j;
                cnt -= j;
                zeroonebag(tmp);
            }
            else{
                tmp = an * cnt;
                zeroonebag(tmp);
                break;
            }
        }
    }
}
int main(){

    while(scanf("%d%d",&n,&m) && n){
        for(int i = 1; i <= n; ++i){
            scanf("%d",&a[i]);
        }
        for(int i = 1; i <= n; ++i){
            scanf("%d",&c[i]);
            sum += a[i] * c[i];
        }
        mem(d);
        if(sum > m) sum = m;
        for(int i = 1; i <= n; ++i){
            change(a[i],c[i]);
        }
        int ans = 0;
        int kase[maxn];

        //判断出现了多少种面值
        mem(kase);
        kase[0] = 1;
        for(int i = 1; i <= m; ++i){
            if(!kase[d[i]]){
                ans++;kase[d[i]] = 1;
                //cout <<d[i] <<" ";
            }
        }
        //cout << endl;
        printf("%d\n",ans);
    }
    return 0;
}
FPGA与GPU异构计算:重塑嵌入式AI的算力边界与场景定义 本文深入探讨了FPGA与GPU异构计算如何突破嵌入式AI的算力瓶颈。通过分析工业视觉、智能交通及航天等场景,阐述了FPGA负责高速数据采集与预处理,GPU专注复杂AI推理的协同模式,有效解决了传统单一架构在算力、功耗、接口和实时性上的挑战,为嵌入式AI应用提供了高效能解决方案。 阅读详情

相关推荐

量化实战:如何用Barra多因子模型给你的投资组合做一次‘风险体检’?

本文详细介绍了如何利用Barra多因子模型对投资组合进行全面的风险体检,帮助投资者识别行业和风格因子的风险暴露。通过实战案例和Python代码示例,展示了数据采集、风险归因和组合优化的完整流程,提升投资组合的风险调整收益。

weixin_27215337的博客 323

HDU2844(多重背包)

题目大意:给你n个种类的钱和对应的数量,同统计一下从1到m能够凑成的钱有多少个;解题思路:多重背包的题,少了一个类似于重量上限的限制,这里其实就是那个m,每次不断变化的1到m的值就是限制,最后统计下多少dp数组更新过就是能够凑到的,这里不用从1到m枚举上限,直接上限填m,这样在更新完n个种类后m之前由于要到达m必然解决比他小的包,简言之,就是前面的dp已经优化了(你想我们既然都优化到m了,像m-1...

小胡同的诗 597

AT32F421玩转AM32电调:手把手教你调试过零点比较器,告别电机抖动

本文详细介绍了如何使用AT32F421芯片调试AM32电调的过零点比较器,解决电机抖动问题。通过硬件配置、软件环境搭建、比较器电路原理分析及filter_level参数动态调整等实战步骤,帮助开发者精准诊断和优化电机控制性能。

weixin_42525632的博客 276

【HDU2844】二进制优化多重背包

1.题目链接。首先这个题的意思就是:n种硬币,每种硬币有面值和数量,给你m,让你求从1到m这m个数据,有多少个可以用这些硬币凑出来。 2.我们分析一下这个问题,似乎是一个背包问题,但是这个是让我们求方案数,而不是最大能够装多少之类的。我们还是按照我们之前的DP方程,在最朴素的多重背包问题种,DP[k]代表容量为k的时候我们最多可以装多少东西,和这个问题好像没啥关系。那么现在就有两个解决方案:把这...

YG爱木木 496

HFSS微带线仿真从零到一:材料参数与求解设置优化指南

在射频电路设计中,微带线仿真涉及电磁场求解与传输线理论,其精度高度依赖材料参数和求解设置。相对介电常数、损耗角正切和导体电导率等参数直接影响特性阻抗与插入损耗,而求解频率、网格划分和参数扫描则决定仿真效率与收敛性。合理设置这些参数可显著提升S参数准确性,避免设计迭代。应用场景包括天线馈线、滤波器和微波互连。本文基于HFSS微带线仿真实践,系统讲解材料选择与参数优化全链路,帮助工程师快速复现可靠模型。

weixin_29192211的博客 79

vscode配置matlab工作环境

前面有两篇文章我们分别讲了在vscode里面如何配置C语言环境和python环境,那两篇文章总体来说比较复杂,当然这篇也有许多有趣的问题。 附上链接: 文章目录matlab简介基本要求code runner插件与matlab相关的插件添加路径小结code runner是否支持更多语言更多选择另一个选择 matlab简介 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 MATLAB是ma

Cachel Wood的博客 4540

hdu2844 完全背包+多重背包(经典)

题意:给你一些不同价值和一定数量的硬币,求用这些硬币可以组合成价值在[1 , m]之间的有多少; 思路:由于考虑时间,所以需要用二进制优化;#include<stdio.h> #include<string.h> #define max(x,y) (x>y?x:y) int a[101],b[101],dp[100001]; int main() { int n,m; while(

hndu__lz的博客 525

19、时间触发通信与时间触发以太网技术解析

本文深入解析了时间触发通信和时间触发以太网(TTEthernet)技术,涵盖了其在实时系统中的应用,特别是安全关键领域如航空航天。文章详细介绍了TTEthernet的通信服务、协议参数化、时钟同步机制、诊断服务、故障隔离方法以及验证工作,并通过示例配置展示了其灵活性和可扩展性。TTEthernet通过引入确定性时间触发通信范式,在同一物理网络上实现了时间触发、速率受限和尽力而为三种流量类别的集成,为分布式实时系统提供了高可靠性和实时性保障。

efc12345678的博客 115

HDU 2844 (多重背包)

多重背包(二进制优化)模板题意: 有n个硬币,每一个硬币有自己的数值Vi,其个数为Ci。不同硬币的不同组合能买到不同物品,问在1~V的区间内最多能买到多少不同种类的物品。 思路: 其实题意也就是求硬币在[1,V][1 , V ] 区间能组合成多少不同数字。那么问题来了,怎么求出? 直接暴力求那是绝对不能做的,现在的比赛怎么存在这么简单的问题。 可以把它转化为背包问题,dp

Since_natural_ran 454

【图像拼接】源码精读:Parallax-Tolerant Unsupervised Deep Image Stitching(UDIS++)

注:Pytorch代码。【图像拼接论文精读】专栏对应文章【图像拼接】论文精读:Parallax-Tolerant Unsupervised Deep Image Stitching(UDIS++)配合对应的文章阅读,效果更佳!注:请重点关注代码段中的注释!!!有一些讲解的东西直接写在代码段的注释中了,同时多关注红色字体和绿色字体!!!我认为深度学习方法和传统方法有很多相似之处。比如:深度学习中的损失函数和传统方法中的对齐项、失真项等其实原理相同,只是求解方式不同。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 7272

物料分类账-返工工单(自身)差异分摊逻辑

如上图所示,当月入库的全部消耗,而返工消耗的数量为100PCS,所以返工消耗占总消耗的比例为100pcs/(205pcs+100pcs)=0.327868852。备注:红色箭头的物料号为产品自己本身所产生的价差,就是返工工单所承担的差异,而我们要计算的就是这个值,所以计算价差不会包括此项。价差合计就是不包括初始分摊的价差9153.7,剩下的价差合计就是返工工单自身所承担的差异4465.21。每一次返工工单所承担的差异都会按照价差*承担比例去计算承担的差异,知道承担完所有差异。

Yeol827的博客 2489

HDU 2844:Coins(多重背包)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2844有 N 种物品和一个容量为 V 的背包。第 i 种物品最多有 ci 件可用,每件耗费的 空间是 wi,价值是 vi。求解将哪些物品装入背包可使这些物品的耗费的空间总和不超 过背包容量,且价值总和最大。这样的是多重背包。多重背包有的暴力就是在01背包的基础上多一重循环:for(k=1;k<=c[i];k+

I don't have the strength. 310

《大数据: Hive 交互命令和常用配置》

一、Hive 交互命令 1. 首先解决一个可能发生的问题 (log4 jar包冲突) 我这里解决方法就是删除一个,我删的是hive下的包 yexiang@hadoop1:<hive>$ hive SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/soft/apache-hive-2.3.7-bin/lib/log4j-slf4j-impl-2.6.2.ja.

yexiang优快云的专栏 288

背包问题的二进制优化

关于二进制优化这一点,它为什么正确,为什么合理,凭什么可以这样分,至少我是花了很久很久才理解的,先拿一道题来说吧。 HDU 2844 Coins 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 题目: Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit

桐小目的秘密基地 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

hdu 2844 Coins

hdu   2844   Coins               题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 题目大意:有n种硬币,给出价值上限m,给出这n中硬币的价值和数量,求价值上限内的价值组合数。 题目分析:看起来像是个不设重量的多重背包,求组合数可以与母函数结合。 code: #include #include int m

slicer的技术交流栈 725

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

POJ 1742/HDU2844 Coins 题解

POJ 1742/HDU2844 Coins 题解

Jeza SS 526

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

HDU 2844: Coins【01背包的二进制优化】

HDU 2844: Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar....

这是一个ACM专用的瞎写给自己看的没什么技术含量的可能是假的博客 253

HDU 2844 Coins (多重背包->类01背包优化)

HDU 2844 Coins (多重背包->类01背包优化) (TEST<31> 11.20) 解题思路 看着就是 多重背包问题 在这里 进行了 0/1背包的优化 用dp【价值】=所能达到的最大价值 来判定是否能够达到 这个 值 关于0/1背包优化 解析 (出自ACwing 基础算法视频第五章 第一节动态规划 ) 看 1023 数字之和能够组成 1023? 0-1023 枚举每...

MaxVen 236

HDU 2844 Coins(多重背包)

HDU Coins(多重背包) http://acm.hdu.edu.cn/showproblem.php?pid=2844 题意: 现在有价值val[1],val[2],…val[n]的n种硬币, 它们的数量分别为num[i]个. 然后给你一个m, 问你区间[1,m]内的所有数目, 由之前n种硬币来构造(即选取某些硬币使得这些硬币的价值和等于[1,m]区间的特定数), 最多能构造出这m个数中的多少个? 分析: 基本的完全背包问题. 我们令dp[i][j]==x表示

code 1321

hdu2844Coins

题目链接: 点击打开链接 题目: Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hibix opened purse and found there were some coins. He decided to buy a very nice watch

大洋深处 1513

HDU 2844 Coins

多重背包。 每个物品分别dp。。 dp[i][j]表示考虑了前i个物品。。装满j的背包。。第i个物品最少拿多少个 这样就可以了 转移大概是。。。dp[i][j] = std::min(dp[i][j - a[i]] + 1, 0 if dp[i - 1][j] a[i]是第i个物品的大小 c[i]是数量 Coins Time Limit: 2000/1

long long ago 1410

Coins HDU - 2844

http://acm.hdu.edu.cn/showproblem.php?pid=2844 多重背包问题 看有哪些容量可以达成 道理和使价值最大化一样 二进制优化一下转为01背包即可 这不是男人八题吗 一直以为是很高深的题。。 #include <bits/stdc++.h> using namespace std; const int maxn=1e2+10; co...

sunyutian1998的博客 276

Poj2844Coins(多重背包)

http://acm.hdu.edu.cn/showproblem.php?pid=2844 Coins Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 18298Accepted Submission(s): 718...

aboc43983的博客 150

HDU 2844 Coins(多重背包,装满可行性)

HDU 2844 Coins    (POJ1742也是这道,但是用多重背包超时)                                                       http://acm.hdu.edu.cn/showproblem.php?pid=2844 题意:        现在有价值val[1],val[2],…val[n]的n种硬币, 它们的数量分别为

sgh666666的博客 588

HDU2844 Coins

题目大意:HIBiX想买一个很nice的watch,他有一堆coins,HiBix估计这个表的价格不会超过m,所以就打算用硬币拼出在m价格以内的价格数以备付款.来一个"苹果式还债",哈哈...  现在HiBiX问这堆硬币可以堆出多少钱值(在m以内) 思路:用多重背包的装满思想,就是对于每一个V,都尽量的去装.如果装满的就是能够拼出的相应价格,但是有一点有点蒙.看代码最后处....

muxi@Achilles的专栏 1112

Coins HDU - 2844(多重背包)

Coins HDU - 2844 (多重背包) Whuacmers use coins.They have coins of value A1,A2,A3…An Silverland dollar. One day Hibix opened purse and found there were some coins. He decided to buy a very nice watch in a nearby shop. He wanted to pay the exact price(without c

Are_you_ready的博客 265
上一篇: uva1593代码对齐
下一篇: 51Nod1086背包问题V2(二进制优化)
Link_Ray
博客等级 码龄9年 44粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值