Money Systems (01背包,累加计数)
来源:互联网 发布:数组未赋值,默认为什么 编辑:程序博客网 时间:2024/05/17 04:37
【问题描述】
母牛们不但创建了他们自己的政府而且选择了建立了自己的货币系统。[In their own rebelliousway],,他们对货币的数值感到好奇。
传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单位面值组成的。
母牛想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值。
举例来说, 使用一个货币系统 {1,2,5,10,...}产生 18单位面值的一些可能的方法是:18x1, 9x2, 8x2+2x1,3x5+2+1,等等其它。写一个程序来计算有多少种方法用给定的货币系统来构造一定数量的面值。保证总数将会适合long long (C/C++) 和 Int64 (Free Pascal)。
【输入文件】
货币系统中货币的种类数目是 V (1<= V<=25)。要构造的数量钱是 N (1<= N<=10,000)。
第 1 行: 二整数, V 和 N
第 2 行: 可用的货币 V 个整数。
【输出文件】
单独的一行包含那个可能的构造的方案数。
【输入样例】
3 10
1 2 5
【输出样例】
10
【问题分析】
把钱面值,把要构造的前看做载重为N的背包,这个问题便是0/1背包的简化版了,但这个问题和传统模型有所差异,不是判断N是否可构成,而是求构成N的方案,而且这里的面值是可以重复利用的(你可以看做是物品有无限多)。
对与第一个问题,只要把原来BOOLEAN型的状态改为INT64,在递推过程中累加方案数即可。
对于第二个问题,基本模型中为了避免重复在内重循环枚举背包载重时采用倒循环,现在只要正向循环就OK了。
复杂度与原模型相同。
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;long long dp[10010], c[30];int main(){ long long V, N; while(scanf("%lld %lld",&V,&N) != EOF) { long long i, j; for(i = 0; i < V; i++) scanf("%lld",&c[i]); memset(dp,0,sizeof(dp)); dp[0] = 1; for(i = 0; i < V; i++) for(j = c[i]; j <= N; j++) dp[j] += dp[j-c[i]]; printf("%lld\n",dp[N]); } return 0;}
- Money Systems (01背包,累加计数)
- Money Systems
- Money Systems
- Money Systems
- USACO / Money Systems货币系统(DP)
- USACO-Section 2.3 Money Systems(DP)
- USACO 2.3Money Systems(简单DP)
- USACO 2.3 Money Systems (money)
- USACO2.3.4 Money Systems (money)
- USACO2.3.4 Money Systems (money)
- Section 2.3 Money Systems
- usaco: Money Systems
- usaco Money Systems
- usaco2.34Money Systems
- USACO-Money Systems
- Money Systems _DP
- usaco Money Systems
- USACO-Money Systems
- spring xmlns 配置
- 堆和栈
- 让总结催化你的收获
- Drupal 模块开发的时候,如何取到数组中的值?
- 开放封闭原则,依赖倒转原则
- Money Systems (01背包,累加计数)
- C语言文件操作函数大全
- Extjs4 Grid 使用总结
- DBWR和LGWR在什么情况下执行写?
- 关于条件编译#ifdef...#endif
- 根据对象批量获取页面数据迭代保存到集合中
- (高精度) Octal Fractions (P1131)
- ZendFrameWork 模块实现
- 步入“数据库”的礼堂——SQL数据库基本功 :语句教程