【寒假每日一题】货币系统(个人练习)详细题解+推导证明(第十七天)

前言

今天是大年初三,但是感觉年已经过去了,哈哈。

今天的题我还忘记发了,
在这里插入图片描述

题目

给定 V 种货币(单位:元),每种货币使用的次数不限。

不同种类的货币,面值可能是相同的。

现在,要你用这 V 种货币凑出 N 元钱,请问共有多少种不同的凑法。

输入格式

  • 第一行包含两个整数 V 和 N。
  • 接下来的若干行,将一共输出 V 个整数,每个整数表示一种货币的面值。

输出格式

  • 输出一个整数,表示所求总方案数。

数据范围

  • 1 ≤ V ≤ 25 , 1≤V≤25, 1V25,
  • 1 ≤ N ≤ 10000 1≤N≤10000 1N10000
  • 答案保证在long long范围内。
输入样例:
3 10
1 2 5
输出样例:
10

在这里插入图片描述

详细题解

写法1 O ( n m ) O(nm) O(nm)

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;
const int N = 30, M = 10005;

int n, m;
LL f[N][M];

int main()
{
    cin >> n >> m;
    f[0][0] = 1;
    for (int i = 1; i <= n; ++ i )
    {
        int v;
        cin >> v;
        for (int j = 0; j <= m; ++ j )
        {
            f[i][j] = f[i-1][j];
            if (j >= v) f[i][j] += f[i][j-v];
        }
    }
    cout << f[n][m] << endl;
    return 0;
}

毫无疑问,这是一个动态规划的题目。

除此之外,这还是个经典的完全背包问题。

最后提交,AC😁
在这里插入图片描述

推导证明

首先需要划分两个情况:

  • 一个是状态表示;
  • 一个是状态计算;

在这里插入图片描述
每次划分的不同是最后一个位置能否整除v:

  • f[i][j]等于每个位置减去n倍的v;
  • 同理,f[i][j-v]等于除了f[i-1][j]的f[i][j]。

写法2 O ( n m ) O(nm) O(nm)

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;
const int N = 30, M = 10005;

int n, m;
LL f[M];

int main()
{
    cin >> n >> m;
    f[0] = 1;
    for (int i = 1; i <= n; ++ i )
    {
        int v;
        cin >> v;
        for (int j = v; j <= m; ++ j )
            f[j] += f[j-v];
    }
    cout << f[m] << endl;
    return 0;
}

最后提交,AC😁
在这里插入图片描述

推导证明

优化的方案是将二维数组变成一维数组,其实在意义上很难理解优化,所以只是一种等价替换。

  • 首先去掉二维数组的第一个维度;
  • 然后判断是否等价;
  • 最后提交AC;

需要注意的是,由于是完全背包问题,所以每个硬币可以被无限次使用,即等价于:

for (int j = v; j <= m; ++ j )
	f[j] += f[j-v];

如果是01背包问题的话,就需要调整j的数据范围,

  • 从大到小循环 f[j-v] 等价于 f[i-1][j-v],
  • 从小到大循环等价于 f[i][j-v]。

由于状态转移方程是 f[j] += f[j-v];,所以涉及到 f[j] 和 f[j-v] 的问题,后者一定前者,所以需要注意大小关系。

举一反三

同样的动态规划问题:【寒假每日一题】数字三角形(个人练习)详细题解+推导证明(第二天)

总结

继续努力,坚持更新,17th打卡。

在这里插入图片描述

我是管小亮 CSDN认证博客专家 TensorFlow PyTorch 图像处理
纸上得来终觉浅,绝知此事要躬行

包括但不局限于机器学习,深度学习,自然语言处理,计算机视觉,知识图谱,还有Python,C++,TensorFlow,Pytorch,Keras,PaddlePaddle等,不定时分享资源(电子书/项目/工具),学习路线,思考,面经等!!!
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页