博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 货币系统
阅读量:5216 次
发布时间:2019-06-14

本文共 1028 字,大约阅读时间需要 3 分钟。

【问题描述】

给你一个n种面值的货币系统,求组成面值为m的货币有多少种方案。

【输入】

第一行输入两个正整数n和m,用空格隔开,分别表示货币系统的面值种数和要组成的总面值。

以下n行,每行输入一个正整数,表示货币系统的面值。

【输出】

一行一个数,表示组成目标面值的方案总数。

【输入输出样例】

money.in

money.out

3 10

1

2

5

10

【数据范围】

对于100%的数据,n<=100,m<=10000。

乍眼一看:

背包问题的方案总数

对于一个给定了背包容量、物品费用、物品间相互关系(分组,依赖)的背包问题,除了再给定每个物品的价值后求可得到的最大值以外,还可以得到装满背包或将背包装置某一容量的方案总数(这道题就是这样)。

对于这类改变问法的问题,一般只需要将转移方程中的max改成sum即可。

例如若每件物品均是01背包中的物品,转移方程即为f[i][v]=sum{f[i-1][v],f[i-1][v-w[i]]+c[i]},初始条件f[0][0]=1;

事实上,这样做可行的原因在于状态转移方程已经考虑了所有可能的背包组成方案。

对于这道 货币系统:

设f[j]表示面值为j的最大方案数,如果f[j-k*a[i]]!=0,则f[j]=f[j]+f[j-k*a[i]],当1<=i<=n,m>=j>=a[i],1<=k<=j/a[i]。

程序

#include
#include
using namespace std;int a[10001],n,m;long long f[10005];//注意long longint main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } f[0]=1; for(int i=1;i<=n;i++) for(int j=m;j>=a[i];j--)//f[j]表示面值为j的方案最优解。 for(int k=1;k<=j/a[i];k++) f[j]+=f[j-k*a[i]]; cout<

 

转载于:https://www.cnblogs.com/FXY-180/p/9509429.html

你可能感兴趣的文章
Hibernate中inverse="true"的理解
查看>>
高级滤波
查看>>
使用arcpy添加grb2数据到镶嵌数据集中
查看>>
[转载] MySQL的四种事务隔离级别
查看>>
QT文件读写
查看>>
C语言小项目-火车票订票系统
查看>>
15.210控制台故障分析(解决问题的思路)
查看>>
BS调用本地应用程序的步骤
查看>>
常用到的多种锁(随时可能修改)
查看>>
用UL标签+CSS实现的柱状图
查看>>
mfc Edit控件属性
查看>>
Linq使用Join/在Razor中两次反射取属性值
查看>>
[Linux]PHP-FPM与NGINX的两种通讯方式
查看>>
Java实现二分查找
查看>>
优秀员工一定要升职吗
查看>>
[LintCode] 462 Total Occurrence of Target
查看>>
springboot---redis缓存的使用
查看>>
架构图-模型
查看>>
sql常见面试题
查看>>
jQuery总结第一天
查看>>