hdu acm 2844 Coins 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844
题目意思:有A1,A2,...,An 这 n 种面值的钱,分别对应的数量是C1,C2,...,Cn。问根据这么多数量的钱 能组成多少个 <= m 的钱。
如果用多重背包来做,超时了...如果用记忆化搜索,还是...超时= =.....
这个方法是网上搜的,觉得好神奇,能看懂一些。
它是根据完全背包的思路做的,但是需要限制每种币种的使用数量,于是就多了个used[] 数组来记录了。 ! f[j]表示之前没有组成 j 这么多的钱,f[j] = 1 就表示已经组成过 j 那么多的钱了,下次再遇到同样能构成 j 那么多的钱就不要再重复算了。 这个f[j-A[i]]用得好巧妙,妙在它 j - A[i] 是绝对比 j 小的,如果在不超过C[i] 数量(used[j-A[i]])的情况下,用一定数量的 A[i] 再加上之前用过的 A[i-1] ,A[i-2],...,A[1] (当然也可以不用,也可以用部分) 这些币值能能够组成 j 这么多钱。
这句:used[j] = used[j-A[i]] + 1; 有一点不太懂,不知道为什么要从used[j-A[i]] 前提下 +1......
代码中注释部分可能有误导别人的成分,欢迎指出不足(哎~~~没办法啦,网上的这份代码,好像没有人写过注释,我也是按自己理解啦= =)
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int maxn = 1e5 + ;
const int N = + ; int A[N], C[N];
int f[maxn], used[maxn]; int main()
{
int n, m;
while (scanf("%d%d", &n, &m) != EOF && (m+n))
{
memset(f, , sizeof(f));
for (int i = ; i < n; i++)
scanf("%d", &A[i]);
for (int i = ; i < n; i++)
scanf("%d", &C[i]);
f[] = ;
int ans = ;
for (int i = ; i < n; i++)
{
for (int j = ; j <= m; j++)
used[j] = ; // used[j]表示当前这种面值为j时用了A[i]多少次,它的使用时限制A[i]被使用的数量,否则就可以用无限个了
for (int j = A[i]; j <= m; j++)
{
if (!f[j] && f[j-A[i]] && used[j-A[i]] < C[i]) // 用f[j]表示能组成这价值为j的钱和不能(0与1), f[j-A[i]] 表示之前能组成j-A[i]这么多钱
{
// printf("!f[j]: !f[%d]; f[j-A[i]]: f[%d]\n", j, j-A[i]);
// printf("used[j-A[i]]: used[%d] = %d, C[i]: C[%d] = %d\n", j-A[i], used[j-A[i]], i, C[i]);
f[j] = ;
used[j] = used[j-A[i]] + ; // 组成j这么多钱还需要用多一次A[i]这样的币值
ans++;
// printf("used[%d] = %d\n", j, used[j]);
// printf("组成面值为 %d 时用了 A[%d](即 %d) %d 次\n\n", j, i, A[i], used[j]);
}
}
}
printf("%d\n", ans);
}
return ;
}
输出变量图,真诚奉献,真心强大啊~~~

hdu acm 2844 Coins 解题报告的更多相关文章
- hdu acm 1114 Piggy-Bank 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 题目意思:给出一个空的猪仔钱ang 的重量E,和一个装满钱的猪仔钱ang 的重量F你,实质上能装 ...
- HDU 4303 Hourai Jeweled 解题报告
HDU 4303 Hourai Jeweled 解题报告 评测地址: http://acm.hdu.edu.cn/showproblem.php?pid=4303 评测地址: https://xoj. ...
- ACM 杭电HDU 2084 数塔 [解题报告]
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- ACM: HDU 1028 Working out 解题报告-DP
Working out time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- ACM : HDU 2899 Strange fuction 解题报告 -二分、三分
Strange fuction Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- hdu 2544 最短路 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目意思:给出 n 个路口和 m 条路,每一条路需要 c 分钟走过.问从路口 1 到路口 n 需 ...
- hdu 1972.Printer Queue 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1972 题目意思:需要模拟打印机打印.打印机里面有一些 job,每个job被赋予1-9的其中一个值,越大 ...
- hdu 1014.Uniform Generator 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1014 题目意思:给出 STEP 和 MOD,然后根据这个公式:seed(x+1) = [seed(x) ...
- hdu 1098 Lowest Bit 解题报告
题目链接:http://code.hdu.edu.cn/game/entry/problem/show.php?chapterid=1§ionid=2&problemid=22 ...
随机推荐
- C# 判断上传图片是否被PS修改过的方法
今天在网上发现一个判断图片是否被Photoshop修改过的方法.发现还不错,呵呵.摘录下来. 讲下基本的原理:其实每张被photoshop修改过的图片都会有Adobe Photoshop这样的字样在图 ...
- HDU 4474 Yet Another Multiple Problem【2012成都regional K题】 【BFS+一个判断技巧】
Yet Another Multiple Problem Time Limit: 40000/20000 MS (Java/Others) Memory Limit: 65536/65536 K ...
- Yii 之视图
控制器方法代码: public function actionIndex(){ $data = array( 'name' => 'zhangsan', 'age' => 12, 'add ...
- hdu4888 多校B 最大流以及最大流唯一判断+输出方案
题意,给一个矩阵,告诉你每行和.每列和,并且限制所填数不大于k,问矩阵是否唯一. 经典建图不说了,第一次遇到判断最大流唯一性的,学习了:用dfs来判断残网中是否还存在环,若存在,则表明绕这个环走一圈, ...
- 第一行代码 Android 思维导图
第一行代码 Android 思维导图
- 死磕 java同步系列之自己动手写一个锁Lock
问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...
- CAN 和 CANopen的区别和联系
1.CAN与CANopen的共同点与不同点: CAN只定义了物理层与链路层,而没有定义用户层,用户可根据自己的需要定义一些网络上的通信约定: CANopen是在CAN的基础上定义了用户层,即规定了 ...
- Hibernate 与Mybatis之比较
1. hibernate是全自动,而mybatis是半自动.hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql.而mybat ...
- PHP用CURL发送Content-type为application/json的HTTP/HTTPS请求
<?php $headers = array( "Content-type: application/json;charset='utf-8'", "Accept: ...
- weblogic内存调整说明
一:WebLogic配置问题: 由于WebLogic的配置问题,我们的测试出现了失败情况.原因是为WebLogic分配的内存太少了.通过修改commom\bin\commEnv.cmd文件来增加内存 ...