POJ1276 Cash Machine 【解法一】
2016-07-19 22:22
309 查看
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.
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.
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.
解法二见【这里】。
二进制优化多重背包。
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.
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.
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.
解法二见【这里】。
二进制优化多重背包。
#include<cstdio> #include<cstring> #include<cmath> bool dp[100010]; int vv[100010],v[15],num[15]; int main() { int i,j,k,m,n,p,q,x,y,z; while (scanf("%d%d",&k,&n)==2) { memset(dp,0,sizeof(dp)); for (i=1;i<=n;i++) scanf("%d%d",&num[i],&v[i]); m=0; for (i=1;i<=n;i++) { for (x=1;x<=num[i];x<<=1) { vv[++m]=x*v[i]; num[i]-=x; } if (num[i]) vv[++m]=num[i]*v[i]; } dp[0]=1; for (i=1;i<=m;i++) for (j=k;j>=vv[i];j--) dp[j]|=dp[j-vv[i]]; for (i=k;;i--) if (dp[i]) { printf("%d\n",i); break; } } }
相关文章推荐
- C#使用回溯法解决背包问题实例分析
- 关于背包问题的一些理解和应用
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#用递归算法解决经典背包问题
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- 动态规划解决背包问题的核心思路
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 自顶向下动态规划解决最长公共子序列(LCS)问题
- 01背包问题
- 91. Decode Ways 动态规划-极客学院
- 动态规划系列【2】最长递增子序列LIS
- 动态规划系列【1】小青蛙跳台阶