当前位置: 首页 > news >正文

1371. 货币系统-dp背包问题

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

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

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

输入格式

第一行包含两个整数 V 和 N。

接下来的若干行,将一共输入 V 个整数,每个整数表示一种货币的面值。

输出格式

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

数据范围

1≤V≤25,
1≤N≤10000
答案保证在long long范围内。

输入样例:
3 10
1 2 5
输出样例:
10

 

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

using namespace std;

// 定义长整型别名,方便后续使用
typedef long long LL;

// 定义常量 N 和 M,分别表示物品数量上限和背包容量上限
const int N = 30, M = 10010;

// n 表示物品数量,m 表示背包容量
int n, m;
// v 数组用于存储每个物品的体积
int v[N];
// f 数组用于存储状态,f[i][j] 表示前 i 个物品装满容量为 j 的背包的方案数
LL f[N][M];

int main()
{
    // 从标准输入读取物品数量 n 和背包容量 m
    scanf("%d%d", &n, &m);
    // 循环读取每个物品的体积
    for (int i = 1; i <= n; i ++ ) scanf("%d", &v[i]);

    // 初始化状态,当没有物品且背包容量为 0 时,方案数为 1
    f[0][0] = 1;
    // 动态规划过程,枚举每个物品
    for (int i = 1; i <= n; i ++ )
        // 枚举背包的每个容量
        for (int j = 0; j <= m; j ++ )
        {
            // 不选择第 i 个物品的方案数
            f[i][j] = f[i - 1][j];
            // 如果当前背包容量 j 大于等于第 i 个物品的体积 v[i]
            if (j >= v[i]) 
                // 选择第 i 个物品的方案数,累加到 f[i][j] 中
                f[i][j] += f[i][j - v[i]];
        }

    // 输出前 n 个物品装满容量为 m 的背包的方案数
    printf("%lld\n", f[n][m]);
    return 0;
}

相关文章:

  • Oracle数据库数据编程SQL<3.4 PL/SQL 自定义函数>
  • HarmonyOSNext_API16_Tabs组件
  • 架构师面试(二十三):负载均衡
  • Spring AI 实现 STDIO和SSE MCP Server
  • C++ STL常用算法之常用查找算法
  • 智能体的学习(一)
  • k8s日志管理
  • Linux网络编程概述
  • ISATAP自动隧道
  • web自动化第一步:安装浏览器和驱动(Chrome和ChromeDriver)
  • 【Java】字符串String类
  • 相似度计算 第33次CCF-CSP计算机软件能力认证
  • 分秒计数器设计
  • XPath、XQuery 以及 XSLT 函数
  • 【工具变量】上市公司供应链稳定性数据两个维度(2013-2023年)
  • Netty源码—10.Netty工具之时间轮二
  • 【已开源】UniApp+vue3跨端应用从0到1开发指南、uniapp+vue3模板应用
  • 生成和管理作品集链接
  • Trae-中国首款免费AI原生IDE
  • Router [Continuation Settings]
  • 自适应网站css 写法/成都自动seo
  • 网站怎么做压力测试/网络营销策划书总结
  • 新网建立网站/福建省人民政府
  • 重庆快速网站建设/it培训班
  • 怎样做元古建筑的网站结构图/可以免费领取会员的软件
  • 廊坊网站建设制作电话/网络营销案例范文