Cash Machine
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 24543 | Accepted: 8596 |
Description
A Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a requested cash amount. The machine uses exactly N distinct bill denominations, say Dk, k=1,N, and for each denomination Dk the machine has a supply of nk bills. For example,
N=3, n1=10, D1=100, n2=4, D2=50, n3=5, D3=10
means the machine has a supply of 10 bills of @100 each, 4 bills of @50 each, and 5 bills of @10 each.
Call cash the requested amount of cash the machine should deliver and write a program that computes the maximum amount of cash less than or equal to cash that can be effectively delivered according to the available bill supply of the machine.
Notes:
@ is the symbol of the currency delivered by the machine. For instance, @ may stand for dollar, euro, pound etc.
N=3, n1=10, D1=100, n2=4, D2=50, n3=5, D3=10
means the machine has a supply of 10 bills of @100 each, 4 bills of @50 each, and 5 bills of @10 each.
Call cash the requested amount of cash the machine should deliver and write a program that computes the maximum amount of cash less than or equal to cash that can be effectively delivered according to the available bill supply of the machine.
Notes:
@ is the symbol of the currency delivered by the machine. For instance, @ may stand for dollar, euro, pound etc.
Input
The program input is from standard input. Each data set in the input stands for a particular transaction and has the format:
cash N n1 D1 n2 D2 ... nN DN
where 0 <= cash <= 100000 is the amount of cash requested, 0 <=N <= 10 is the number of bill denominations and 0 <= nk <= 1000 is the number of available bills for the Dk denomination, 1 <= Dk <= 1000, k=1,N. White spaces can occur freely between the numbers in the input. The input data are correct.
cash N n1 D1 n2 D2 ... nN DN
where 0 <= cash <= 100000 is the amount of cash requested, 0 <=N <= 10 is the number of bill denominations and 0 <= nk <= 1000 is the number of available bills for the Dk denomination, 1 <= Dk <= 1000, k=1,N. White spaces can occur freely between the numbers in the input. The input data are correct.
Output
For each set of data the program prints the result to the standard output on a separate line as shown in the examples below.
Sample Input
735 3 4 125 6 5 3 350 633 4 500 30 6 100 1 5 0 1 735 0 0 3 10 100 10 50 10 10
Sample Output
735 630 0 0
Hint
The first data set designates a transaction where the amount of cash requested is @735. The machine contains 3 bill denominations: 4 bills of @125, 6 bills of @5, and 3 bills of @350. The machine can deliver the exact amount of requested cash.
In the second case the bill supply of the machine does not fit the exact amount of cash requested. The maximum cash that can be delivered is @630. Notice that there can be several possibilities to combine the bills in the machine for matching the delivered cash.
In the third case the machine is empty and no cash is delivered. In the fourth case the amount of cash requested is @0 and, therefore, the machine delivers no cash.
In the second case the bill supply of the machine does not fit the exact amount of cash requested. The maximum cash that can be delivered is @630. Notice that there can be several possibilities to combine the bills in the machine for matching the delivered cash.
In the third case the machine is empty and no cash is delivered. In the fourth case the amount of cash requested is @0 and, therefore, the machine delivers no cash.
题意:
给出N钱(1到100000)和M种钱币(0到10),随后给出每一种钱币的数量num(0到1000)和价值val(0到1000)。问如何凑数,在不超过总钱数的钱数下达到最大值。
思路:
多重背包。
AC1:
#include<stdio.h> #include<string.h> int cash,kind; int num[15],mon[15]; int dp[100005]; void zeroonepack(int number,int money) { for(int j=cash;j>=money;j--) if(dp[j]<dp[j-money]+money) dp[j]=dp[j-money]+money; return; } void completepack(int number,int money) { for(int j=money;j<=cash;j++) if(dp[j]<dp[j-money]+money) dp[j]=dp[j-money]+money; return; } void multipack(int number,int money) { int k=1; if(number*money>cash) completepack(number,money); else { while(k<number) { zeroonepack(number*k,money*k); number-=k; k+=k; } zeroonepack(number*number,money*number); } return; } int main() { while(scanf("%d%d",&cash,&kind)!=EOF) { memset(dp,0,sizeof(dp)); for(int i=1;i<=kind;i++) scanf("%d%d",&num[i],&mon[i]); for(int i=1;i<=kind;i++) multipack(num[i],mon[i]); printf("%d\n",dp[cash]); } return 0; }
AC2:
#include<stdio.h> #include<string.h> int cash,kind; int mon[1000]; int dp[150000]; int main() { while(scanf("%d%d",&cash,&kind)!=EOF) { int number,money,k=0; memset(dp,0,sizeof(dp)); for(int i=1;i<=kind;i++) { scanf("%d%d",&number,&money); for(int j=1;j<=number;j++) mon[k++]=j*money,number-=j; if(number>0) mon[k++]=number*money; } for(int i=0;i<k;i++) for(int j=cash;j>=mon[i];j--) if(dp[j-mon[i]]+mon[i]>dp[j]) dp[j]=dp[j-mon[i]]+mon[i]; printf("%d\n",dp[cash]); } return 0; }
相关推荐
北大POJ1276-Cash Machine 解题报告+AC代码
北大POJ1276试题代码
C#Cash缓存类,里面有使用方法案例,方便各位参考,操作简单
提款机什么是提款机? 在我们这个时代,有很多 javascript 客户端和后端框架。 但是为了更好地理解我们应该练习,所以我创建了 repo 来使用不同的框架在那里编写相同的应用程序“取款机”。 该应用程序有背面和...
《Google Cash》快速致富手册,国外高手的操作技巧!
html checkbox cash 表单提交checkbox 多选
cash flow review. explain what the meaning of cash flow.
google cash 中文版教你怎么在网上赚钱~唉~凑二十个字~~~
NULL 博文链接:https://ownraul.iteye.com/blog/728063
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View;...import android.view.View.OnClickListener;...public class ...安卓开发中cash跳转的用法
前端项目-cash,对于现代浏览器来说,jquery是一个非常小的选择。
python库。 资源全名:Cash-App-Hack-Money-Generator-2021-2.2.1.tar.gz
现金及现金的内控cash and cash control
CaixaEletrônico-Python :laptop: 普罗耶托脚本feito com Python,atravésda plataforma School of Net。sen Desenvolvedor
Cash - 一个用ES6编写的跨平台实现Unix shell命令实现
《Google Cash》Google AdWords 快速致富手册中文版
安装依赖项 在根目录中运行npm i 在/ client目录中运行npm i Postgres设定 安装postgres 更改db / index.js中的pg连接字符串以匹配您的数据库设置 运行node node_modules/connect-pg-simple/table.sql设置表以存储...
sap abap cash flow report
下属cash.pptx
SAP 标准教材 现金管理 ,英文版CASH MANAGEMENT