USACO Section2.3 Money Systems 解题报告 【icedream61】
money解题报告
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
你有V种硬币,每种硬币面值都告诉你。
请问,用它们凑出面值N,总共有多少种情况?
【数据范围】
1<=V<=25
1<=N<=10000
数据保证,总情况数不超过long long。
【输入格式】
第一行给出V和N。
后面给出所有V种面值。
【输入样例】
3 10
1 2 5
【输出样例】
10
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
完全背包问题。
之前写过背包问题的总结,不懂的同学可以去看我之前的博文:“背包问题基本解法 —— 《背包九讲》笔记”。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
开始对这题的数据范围并没有什么认识,于是枚举过了前7个点,第8个点超时。
自己调试了下,发现整数拆分竟然有如此多种情况。于是换用神奇的背包做了。
------------------------------------------------------------------------------------------------------------------------------------------------
【代码(注意,本题给出了两个版本的代码:背包算法和枚举法。)】
AC版本,即背包算法。
/*
ID: icedrea1
PROB: money
LANG: C++
*/ #include <iostream>
#include <fstream>
using namespace std; const int maxv = +;
const int maxn = +;
bool b[maxn];
int d[maxv]; int c[maxv];
long long cnt[maxn]; int main()
{
ifstream in("money.in");
ofstream out("money.out"); int V,N; in>>V>>N;
for(int i=,x;i<=V;++i) { in>>x; if(x<=N) b[x]=true; }
V=;
for(int i=;i<=N;++i)
if(b[i]) d[++V]=i; // 保证输入硬币是从小到大的 cnt[]=;
for(int i=;i<=V;++i)
for(int j=d[i];j<=N;++j) cnt[j]+=cnt[j-d[i]]; out<<cnt[N]<<endl; in.close();
out.close();
return ;
}
只过7个点的版本,即枚举法。
/*
ID: icedrea1
PROB: money
LANG: C++
*/ #include <iostream>
#include <fstream>
using namespace std; const int maxv = +;
const int maxn = +;
bool b[maxn];
int d[maxv]; int c[maxv];
long long ts; long long count(int n,int v) // 还剩n元,要决定d[v]的个数
{
//cout<<n<<' '<<v<<endl; //cin.get();
++ts; //if(ts%100000000==0) cout<<ts<<endl;
if(n==) return ;
if(v==) return ;
long long s=;
for(int i=;d[v]*i<=n;++i)
{
c[v]=i; s+=count(n-d[v]*i,v-);
}
return s;
} int main()
{
ifstream in("money.in");
ofstream out("money.out"); int V,N; in>>V>>N;
for(int i=,x;i<=V;++i) { in>>x; if(x<=N) b[x]=true; }
V=;
for(int i=;i<=N;++i)
if(b[i]) d[++V]=i; // 保证输入硬币是从小到大的 cout<<count(N,V)<<endl;
cout<<"ts="<<ts<<endl; in.close();
out.close();
return ;
}
USACO Section2.3 Money Systems 解题报告 【icedream61】的更多相关文章
- USACO Section2.1 The Castle 解题报告
castle解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section2.1 Ordered Fractions 解题报告
frac1解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】
holstein解题报告 --------------------------------------------------------------------------------------- ...
- USACO Section2.2 Preface Numbering 解题报告 【icedream61】
preface解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.1 Hamming Codes 解题报告 【icedream61】
hamming解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.3 Controlling Companies 解题报告 【icedream61】
concom解题报告------------------------------------------------------------------------------------------ ...
- USACO Section2.3 Zero Sum 解题报告 【icedream61】
zerosum解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.3 Cow Pedigrees 解题报告 【icedream61】
nocows解题报告------------------------------------------------------------------------------------------ ...
- USACO Section2.3 Longest Prefix 解题报告 【icedream61】
prefix解题报告------------------------------------------------------------------------------------------ ...
随机推荐
- Ionic+AngularJS 开发的页面在微信公众号下显示不出来原因查究
ionic 页面 微信浏览器遇到的坑 公司的微信公众号一部分页面是用AngularJS+Ioinc开发,发现在本地浏览器测试的时候都没问题,传到服务器在微信公众号下跑就出问题来,经查是: index- ...
- MSMQ学习笔记二——创建Message Queue队列
一.创建Message Queue队列的主要流程 1.定义MQQUEUEPROPS 结构: 2.设置消息队列属性: 3.初始化MQQUEUEPROPS 结构: 4.调用MQCreateQueue创建队 ...
- OpenGL学习 Introduction
OpenGL and Graphics Pipeline The word pipeline is from production lines in factories.Generating a pr ...
- 硬件-ESP32S模块资料
1.产品概述 ESP-32S WiFi 模块是由安信可科技自主设计研发,该模块核心处理器 ESP32提供了一套完整的802.11 b/g/n/e/i 无线局域网(WLAN)和蓝牙4.2解决方案,具有最 ...
- C盘压缩,电脑无法正常启动的解决方法?
有时候,我们觉得电脑很卡,因此压缩磁盘来节约资源,前段时间,由于不小心将C盘压缩了,导致电脑无法正常启动,查了一些有关的资料,发现很多人都遇到过类似的问题,如果你不想重装系统的话,那么,现在我说一下我 ...
- 过河问题(POJ1700)
题目链接:http://poj.org/problem?id=1700 解题报告: 1.贪心算法,每次过两个速度最慢的人,抵消那个较慢的人的时间. #include <stdio.h> # ...
- failed to bind pixmap to texture
问题描述:我用的是Ubuntue的操作系统,终端突然挂了.我重启了一下电脑,就进不去系统了. 日志信息: failed to bind pixmap to texture 原因: 界面管理工具坏了, ...
- 字符串缓冲区StringBuffer类,正则表达式
StringBuffer类 StringBuffer又称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容.它是一个容器,容器中可以装很多字符串. ...
- 深入理解JVM类加载机制
1.什么是类加载机制? JVM把class文件加载到内存里面,并对数据进行验证.准备.解析和初始化,最终能够被形成被JVM可以直接使用的Java类型的过程. 生命周期包含:加载,验证,准备,解析,初始 ...
- Git工作流指南:功能分支工作流(转)
一旦你玩转了集中式工作流,在开发过程中可以很简单地加上功能分支,用来鼓励开发者之间协作和简化交流. 功能分支工作流背后的核心思路是所有的功能开发应该在一个专门的分支,而不是在master分支上.这个隔 ...