(中石油十)问题 L: K(dp入门,水题)

钱币兑换问题的小变形

刚刚整理完dp,又正好做到钱币兑换变形题,其实之前一篇文章我已经说过解决方法,当做一道dp水题吧。

问题 L: K

题目描述
小 Z 整理完房间时间已经不早了,简单洗漱一下就上床睡觉了,自从进入初三后小 Z 已经有很久没有做梦了,不做梦的主要原因是学习强度太大加上睡得较晚,一旦睡着就睡 得特别沉,沉到没有梦的地步。今晚小 Z 的大脑皮层特别兴奋,小 Z 回到宾馆立刻打开笔记本开始命题:
已知收银员要找给小 Z 的金 额 N、钱柜里的硬币种类 K 以及 K 种硬币的面额,计算有多少种不同的找零方法? 这里的 “不同”是指所找零钱至少有一种硬币的数量不相同。假设现在只有 2 种硬币,一种面额是 5 分,另一种面额是 1 分,要找给小 Z 的金额是 8 分钱,可以给小 Z 找 1 个五分硬币加3 个一分硬币,或者找 8 个一分硬币。用 3 个一分硬币加 1 个五分硬币本质上与 1 个五分硬币加 3 个一分硬币没有任何区别,因此只可以用两种不同的方式找出八分钱。
输入
输入数据第一行有两个用空格隔开的整数 N 和 K,其中 1≤N≤300,表示超市收银员 要找给小 Z 的金额,1≤K≤8,表示收银员的钱柜里共有 K 种不同面额的硬币。
第 2 到 K+1 行每行包含一个正整数 Ci,其中 1≤Ci≤100,表示一种硬币的面额,在输入数据中硬币 面额按降序排列(从最大到最小)。
不同种类的硬币面额各不相同,每种硬币都取之不尽 用之不竭。
输出
输出数据仅有一行包含一个整数,表示超市收银员可能的找零方案数。答案保证不会 超出长整型范围。需要注意的是如果没有面额为 1 分的硬币,有些金额将无法找零,此时 结果就输出 0。
样例输入 Copy
83 5
50
25
10
5
1
样例输出 Copy
159
提示
样例解释
输入详解:收银员要找给小 Z 金额 83 分,共有 5 种硬币,面额分别为:50,25,10, 5, 1

输出详解:以下是全部 159 种找零方案中的 前 15 种和最后一种:

0×50 0×25 0×10 0×5 83×1
0×50 0×25 0×10 1×5 78×1
0×50 0×25 0×10 2×5 73×1
0×50 0×25 0×10 3×5 68×1
0×50 0×25 0×10 4×5 63×1
0×50 0×25 0×10 5×5 58×1
0×50 0×25 0×10 6×5 53×1
0×50 0×25 0×10 7×5 48×1
0×50 0×25 0×10 8×5 43×1
0×50 0×25 0×10 9×5 38×1
0×50 0×25 0×10 10×5 33×1
0×50 0×25 0×10 11×5 28×1
0×50 0×25 0×10 12×5 23×1
0×50 0×25 0×10 13×5 18×1
0×50 0×25 0×10 14×5 13×1
……………………………………………
1×50 1×25 0×10 1×5 3×1

数据范围

10%的数据满足:N≤50,K≤3,Ci≤10

30%的数据满足:N≤100,K≤5,Ci≤20

60%的数据满足:N≤100,K≤7,Ci≤50

100%的数据满足:N≤300,K≤8,Ci≤100

**

下面正文

**
题目太长我缩减一下。
1、有无限个K种货币,分别价值a[1],a[2],……a[k](放在一个数组中)。
2、用这些换成N元。
3、有多少种换法?

数据设很大,明摆深搜超时,逼你玩dp。

直接上代码。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf = (int) 1e9+7;
const int MAXN = 32767+10;	//假设  N<32767 
LL dp[MAXN];
int main(){
    int n,k;
    cin>>n>>k;
    int a[k];
    for(int i=0;i<k;i++)	cin>>a[i];
    memset(dp, 0, sizeof(dp));
    dp[0] = 1;
    for( int i=0; i<k; i++ ){
        for( int j=a[i]; j<=n; j++ )
            dp[j] = dp[j] + dp[j-a[i]];
    }
    cout<<dp[n]<<endl;
    return 0;
}


这里明显可以看到我把之前一篇文章的钱币兑换问题代码复制了一下(注释还在)。然后细节改改,比较前一篇文章,自己找不同吧。

个人觉得:把钱币兑换问题看到01背包明显不合理,货币是无限个的,调试过程中递增式跟这没什么关系,
纠错看过背包九讲后,这种题虽然不是01背包问题,但属于完全背包问题(这里不细讲)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值