有的物品只可以取一次或不取(基本的0-1背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包),就是混合背包问题。

The Fewest Coins

题意:

农夫John到城里去买一些农具。John是一个非常有效率的人,他总是以这样一种方式来买他的货物:最少数量的硬币易手,也就是他用来支付的硬币的数量加上他收到的找零的硬币数量要最小化。请您帮助他确定这个最小值是多少。
农夫John想购买T (1≤T≤10,000)美分的商品。货币体系有N (1 ≤ N ≤ 100)种不同的硬币,其面值为V1, V2, …, VN (1 ≤ Vi ≤ 120)。农夫John有面值为V1的硬币 C1枚,面值为 V2的硬币C2枚,…,面价为VN的硬币CN 枚(0 ≤ Ci ≤ 10,000)。店主则拥有所有的硬币无限枚,并且总是以最有效的方式进行找零(尽管农夫John必须确保以能够进行正确的找零方式付款)。

输入

第一行:两个用空格分隔的整数N和T;
第二行:N个用空格分隔的整数,分别为V1, V2, …, VN;
第三行:N个用空格分隔的整数,分别为 C1, C2, …, CN。

输出

输出1行,给出一个整数,在支付和找零中使用硬币的最小数。如果农夫John支付和接收准确的找零是不可能的,输出-1。

题解

首先用完全背包预处理找零j的时候最少需要多少硬币,然后用多重背包处理付款j的时候最少需要多少银币,最后将两个加起来就行,求最小值。

#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
const int inf=0x3f3f3f3f;
//约翰对不同金额所付的最少硬币数量
int dp1[25000];
//店长对不同金额所付的最少硬币数量
int dp2[25000];
int v[105],w[105];
//完全背包
void com(int w,int sum)
{for(int i=w;i<=sum;i++)dp2[i]=min(dp2[i],dp2[i-w]+1);
}
//多重背包
void mul(int v,int w,int sum)
{if(w*v>=sum){for(int i=w;i<=sum;i++)dp1[i]=min(dp1[i],dp1[i-w]+1);}else{int k=1;while(k<v){for(int i=sum;i>=k*w;i--)dp1[i]=min(dp1[i],dp1[i-k*w]+k);v-=k;k*=2;}for(int i=sum;i>=v*w;i--)dp1[i]=min(dp1[i],dp1[i-v*w]+v);}
}
int main()
{int n,t;scanf("%d%d",&n,&t);int sum=0;for(int i=0;i<n;i++){scanf("%d",&w[i]);sum=max(sum,w[i]);}for(int i=0;i<n;i++)scanf("%d",&v[i]);sum=sum*sum+t+1;memset(dp1,inf,sizeof(dp1));memset(dp2,inf,sizeof(dp2));dp1[0]=0;dp2[0]=0;for(int i=0;i<n;i++){com(w[i],sum);mul(v[i],w[i],sum);}int res=inf;for(int i=t;i<=sum;i++)res=min(res,dp1[i]+dp2[i-t]);if(res==inf)cout<<-1<<endl;elsecout<<res<<endl;return 0;
}

The Fewest Coins (混合背包)相关推荐

  1. 【题目记录】——POJ 3260 The Fewest Coins 混合背包

    POJ 3260 The Fewest Coins 题目地址[POJ 3260 The Fewest Coins] 题意:John要去买价值为m的商品. 现在的货币系统有n种货币,对应面值为val[1 ...

  2. hdu-2844 Coins (混合背包+二进制优化)

    HDU链接 文章目录 题目描述: 题意: 题解 (代码) 题目描述: 输入描述: 输出描述: For each test case output the answer on a single line ...

  3. 洛谷P2851 [USACO06DEC]最少的硬币The Fewest Coins(完全背包+多重背包)

    题目描述 Farmer John has gone to town to buy some farm supplies. Being a very efficient man, he always p ...

  4. 【POJ3260】The Fewest Coins 多重背包+完全背包

    A来B处买东西,价值M元,有N种钱,每种钱A有一定数量,而B有无限数量. 求最少用多少张钞票可以满足交易,比如样例,A出50+25,B找5,即可满足,需要3张. A用多重背包转移状态,B用完全背包. ...

  5. [USACO06DEC]The Fewest Coins G(混合背包)

    [USACO06DEC]The Fewest Coins G 题目描述 Farmer John has gone to town to buy some farm supplies. Being a ...

  6. The Fewest Coins(多重背包+完全背包)

    The Fewest Coins(多重背包+完全背包) Farmer John has gone to town to buy some farm supplies. Being a very eff ...

  7. 洛谷P2851 [USACO06DEC]The Fewest Coins G 题解

    洛谷P2851 [USACO06DEC]The Fewest Coins G 题解 题目链接:P2851 [USACO06DEC]The Fewest Coins G 题意: Farmer John ...

  8. Codevs 3269 混合背包

    3269 混合背包 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值 ...

  9. 九十一、动态规划系列 背包问题之混合背包

    @Author:Runsen @Date:2020/09/27 背包系列,是动态规划里一类典型的问题,主要有:01背包,完全背包,多重背包,混合背包,二维费用背包,分组背包,有依赖背包和泛化物品等.也 ...

最新文章

  1. 调用浏览器的打印方法打印页面内容
  2. VS 2010 通过 Architecture创建UML类图设计
  3. Iframe中的SSRS报表中使用windows.open在新窗口中不能打开URL中的问题
  4. springboot整合flowable
  5. C语言背包问题的算法(附完整源码)
  6. SAP 电商云 Spartacus UI 如何在应用程序里捕捉到成功下单的事件
  7. 面试用涉及到的jvm常见的面试题(一)
  8. [Leedcode][JAVA][第76题][最小覆盖子串]滑动窗口]
  9. C++函数的用法:erase函数
  10. Java 建模: 子整体软件开发,第二部分
  11. python3中maketrans()方法的使用
  12. 简述计算机控制系统调试和运行的过程,简述计算机原理与系统启动过程
  13. 3-31Pytorch与auto-variabletensor
  14. JavaEE_Spring Framework
  15. C++面试高频考点整理--基础
  16. 洛谷P5706 【深基2.例8】再分肥宅水(c ,c++混合版)
  17. 机器学习sklearn 计算recall , precison , F1
  18. LM在speech recognition中的应用
  19. 将一个随机字符串中的所有字符升序排列,并倒叙打印
  20. python去掉每行前面_第一个python去掉行号

热门文章

  1. 射影几何----共线四点保交比的三种射影变换类型的几何表示
  2. 关系网络lbs的应用_基于LBS的陌生人社交APP
  3. VSCode软件介绍
  4. 白鲸优化算法(Beluga whale optimization,BWO)Python实现
  5. Java 查询企业基本信息接口实现(企查查)
  6. 原装世嘉土星SS手柄(Sega Saturn)改USB接口,实现低延时USB格斗手柄
  7. 赴日工作之在留换签证
  8. 又一家初创公司获得数千万融资进军边缘计算赛道!
  9. Freeswitch服务+语音网关设备发送短信功能
  10. 【zer0pts CTF 2022】 Anti-Fermat