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

Farmer John has gone to town to buy some farm supplies. Being a very efficient man, he always pays for his goods in such a way that the smallest number of coins changes hands, i.e., the number of coins he uses to pay plus the number of coins he receives in change is minimized. Help him to determine what this minimum number is.

FJ wants to buy T (1 ≤ T ≤ 10,000) cents of supplies. The currency system has N (1 ≤ N ≤ 100) different coins, with values V1, V2, ..., VN (1 ≤ Vi ≤ 120). Farmer John is carrying C1 coins of value V1, C2 coins of value V2, ...., and CN coins of value VN (0 ≤ Ci ≤ 10,000). The shopkeeper has an unlimited supply of all the coins, and always makes change in the most efficient manner (although Farmer John must be sure to pay in a way that makes it possible to make the correct change).

Input

Line 1: Two space-separated integers: N and T.
Line 2: N space-separated integers, respectively V 1, V 2, ..., VN coins ( V 1, ... VN)
Line 3: N space-separated integers, respectively C 1, C 2, ..., CN

Output

Line 1: A line containing a single integer, the minimum number of coins involved in a payment and change-making. If it is impossible for Farmer John to pay and receive exact change, output -1.

Sample Input

3 70
5 25 50
5 2 1

Sample Output

3

Hint

Farmer John pays 75 cents using a 50 cents and a 25 cents coin, and receives a 5 cents coin in change, for a total of 3 coins used in the transaction.

题意:农民去买东西,他有n种硬币并且每种硬币都有一定数量,然后商家有这n种硬币不限数量。最后求农民买东西最少要花多少个硬币(他所支付的和商家找零给他的),也就是说农民可以刚好支付t,也可以是通过支付x找零y达到t,两者的关系是t=x-y,也就是说找零的钱数y=x-t,那么可以对农民的硬币运用多重背包求解出dp[],然后对商家进行完全背包dp2[],两者关系是总硬币数ans=(dp[i]+dp2[i-t])min,代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define INF 0x3f3f3f
int p[300000]={0},q[300000]={0};
int dp[25020],dp2[25020];
int n,t,top=0,v[105],c[105];
int main(){memset(dp,INF,sizeof(dp));memset(dp2,INF,sizeof(dp2));dp[0]=0;dp2[0]=0;scanf("%d%d",&n,&t);for(int i=0;i<n;i++)scanf("%d",&v[i]);for(int i=0;i<n;i++)scanf("%d",&c[i]);for(int i=0;i<n;i++){for(int j=1;j<=c[i];j<<=1){p[top]=j*v[i];    //记录钱数q[top]=j;     //记录硬币数c[i]-=j;top++;}if(c[i]>0){p[top]=c[i]*v[i];q[top]=c[i];top++;}}            //二进制优化,把多重背包转化成01背包for(int i=0;i<top;i++){for(int j=t+10000;j>=p[i];j--){dp[j]=min(dp[j],dp[j-p[i]]+q[i]);  }}for(int i=0;i<n;i++){for(int j=v[i];j<=t+10000;j++){dp2[j]=min(dp2[j],dp2[j-v[i]]+1);}}  //完全背包(商家找零的硬币数)int ans=INF;for(int i=t;i<=t+10000;i++)ans=min(ans,dp[i]+dp2[i-t]);  //求出最小硬币数if(ans==INF)printf("-1\n");else{printf("%d\n",ans);}return 0;
}

The Fewest Coins(多重背包+完全背包)相关推荐

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

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

  2. 【BZOJ 1716】 [Usaco2006 Dec]The Fewest Coins 找零钱(背包dp)

    题目 Description 农夫John想到镇上买些补给.为了高效地完成任务,他想使硬币的转手次数最少.即使他交付的硬币数与找零得到的的硬币数最少. John想要买T(1<=T<=100 ...

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

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

  4. The Fewest Coins (混合背包)

    有的物品只可以取一次或不取(基本的0-1背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包),就是混合背包问题. The Fewest Coins 题意: 农夫John ...

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

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

  6. 动态规划之背包问题---01背包---完全背包---多重背包

    本篇博客是基于Carl大佬的刷题笔记 (代码随想录) 进行总结的 另外加入了我自己的一些整理,特此记录,以防遗忘 几种在面试中常见的背包,其关系如下: 通过这个图,可以很清晰分清这几种常见背包之间的关 ...

  7. POJ 3260 多重背包+完全背包

    前几天刚回到家却发现家里没网线 && 路由器都被带走了,无奈之下只好铤而走险尝试蹭隔壁家的WiFi,不试不知道,一试吓一跳,用个手机软件简简单单就连上了,然后在浏览器输入192.168 ...

  8. 动态规划总结(01背包 完全背包 多重背包)

    动态规划总结(01背包 完全背包 多重背包) 一.学习资料 1.UVA DP 入门专题 2.夜深人静写算法(二) - 动态规划 3.算法之动态规划 4.什么是动态规划?动态规划的意义是什么? 5.01 ...

  9. 旅行商的背包(二进制优化多重+0/1背包枚举体积))

    旅行商的背包(二进制优化多重+0/1背包枚举体积)) 题目描述 小 S 坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有 n n n 种, ...

最新文章

  1. 学习opencv(1)
  2. 加载中...loading... 图片_搞笑图片:小子这就是你单身的原因...
  3. 云计算虚拟化技术会是企业安全黑洞?
  4. 忍者必须死3 玩什么忍者_降维:忍者新手
  5. Error starting userland proxy: listen tcp 0.0.0.0:8080: bind: address already in use.
  6. 程序员爬虫竟构成犯罪?
  7. 也写Jquery插件,拖动布局
  8. PGPool使用限制 1
  9. 解决html标签中有多个空格
  10. 手机wap网站制作教程
  11. xp任务栏一直闪跳怎么办_电脑的任务栏在不停闪烁,这个是什么问题引起的
  12. 微信小程序怎么做【零基础教程附源码】
  13. HDFS加密存储(HDP、Ranger、Ranger KMS实现)
  14. facebook登录和分享
  15. 日期转农历日期的一个插件
  16. 知识图谱或成AI发展重点,投研数据整理耗时可从一周缩至一分钟
  17. vue 项目在index.html页面直接引入jq库,报错$ is not defined解决方案
  18. 数据库表设计-第三方登录用户表结构设计
  19. 微信支付接口调用问题(android正常,iphone调不起)
  20. Android Studio中虚拟机运行时报错的解决方法

热门文章

  1. 机械师f117-7p安装linux禁用触摸板问题
  2. 计算机相关期刊阅读,计算机领域的所有SCI一区期刊,这是最顶级期刊了.doc
  3. mysql leader/followers_half-sync/half-async 和 Leader/Followers 模式的主要区别
  4. 【计算机网络】第六部分 应用层(26) 远程登录、电子邮件与文件传输
  5. PS——使用 快速选择工具、魔法棒 抠图
  6. 【蓝桥杯大赛】简单回忆一下我的蓝桥杯比赛历程
  7. 《活出生命的意义》生命之意义
  8. javafx 教程_集成JavaFX和Swing
  9. php获取应用宝app下载连接
  10. 2020 中秋、国庆快乐!