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】的更多相关文章

  1. USACO Section2.1 The Castle 解题报告

    castle解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...

  2. USACO Section2.1 Ordered Fractions 解题报告

    frac1解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...

  3. USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】

    holstein解题报告 --------------------------------------------------------------------------------------- ...

  4. USACO Section2.2 Preface Numbering 解题报告 【icedream61】

    preface解题报告----------------------------------------------------------------------------------------- ...

  5. USACO Section2.1 Hamming Codes 解题报告 【icedream61】

    hamming解题报告----------------------------------------------------------------------------------------- ...

  6. USACO Section2.3 Controlling Companies 解题报告 【icedream61】

    concom解题报告------------------------------------------------------------------------------------------ ...

  7. USACO Section2.3 Zero Sum 解题报告 【icedream61】

    zerosum解题报告----------------------------------------------------------------------------------------- ...

  8. USACO Section2.3 Cow Pedigrees 解题报告 【icedream61】

    nocows解题报告------------------------------------------------------------------------------------------ ...

  9. USACO Section2.3 Longest Prefix 解题报告 【icedream61】

    prefix解题报告------------------------------------------------------------------------------------------ ...

随机推荐

  1. 0 - python简介

    Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  2. 《孵化Twitter》:Twitter创始人勾心斗角史,细节披露程度令人吃惊

    本书详细讲述twitter的发展史.感觉基本上是一部创始人从朋友变敌人,勾心斗角的历史.Twitter本身的产品发展反而相对比较简单. 书中披露了许多email.谈话.会议的细节,作者说这些是数百个小 ...

  3. Javascript作业—封装type函数,返回较详细的数据类型

    Javascript作业—封装type函数,返回较详细的数据类型 思路: 1 取typeof的值,如果是数字.函数等非对象类型,直接取类型 2 如果是object类型,则调用Object.protot ...

  4. 模拟网页的浏览Stack(POJ1028)

    题目链接:http://poj.org/problem?id=1028 注意: 1.用两个栈来模拟,一个用来存可以返回的,一个用来存可以前进的. 2.visit方法,就要将可以前进的栈清空. 3.ba ...

  5. spring boot学习1

    转:https://blog.csdn.net/jsyxcjw/article/details/46763639 1 开始 1.1 spring介绍 Spring Boot使开发独立的,产品级别的基于 ...

  6. Jmeter启动错误

    错误一 1 apache-jmeter-2.13\bin>jmeter 'findstr' 不是内部或外部命令,也不是可运行的程序 或批处理文件. Not able to find Java e ...

  7. while counter<10:

    [root@chenbj test]# python Python 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat ...

  8. tp5 验证是不是ajax提交

    话不多说,看代码 if(request()->isAjax()){ return "是ajax提交"; }else{ return "不是ajax提交"; ...

  9. 复式记账中"借"与"贷"的理解

    财务常识中,复式记账法应用极广,公司采用的是它的借贷记账法.因此,深刻的理解"借"与"贷"的含义极其重要.  一切从历史说起. 起源: Credit  英文含义 ...

  10. JDBC完美连接方法

    jdbc:mysql://localhost:3306:test这句里面分如下解析:jdbc:mysql:// 是指JDBC连接方式:localhost: 是指你的本机地址:3306 SQL数据库的端 ...