背包问题求方案数(二)

简介: AcWing算法提高课内容,本文讲解 动态规划

货币系统

题目要求

题目描述:

给你一个 n 种面值的货币系统,求组成面值为 m  的货币有多少种方案。

输入格式:

第一行,包含两个整数 n  和 m 。

接下来 n 行,每行包含一个整数,表示一种货币的面值。

输出格式:

共一行,包含一个整数,表示方案数。

数据范围:

n15,m3000

输入样例:

3 10
1
2
5

输出样例:

10

思路分析

f[i]代表恰好用了 i元钱的时候的方案数,注意本题会爆 i n t,需要开longlong

代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 3010;
LL f[N];
int main()
{
    int n, m;
    cin >> n >> m;
    f[0] = 1;
    for (int i = 1; i <= n; i ++ )
    {
        int w;
        cin >> w;        
        for (int j = w; j <= m; j ++ )
            f[j] += f[j - w];
    }
    cout << f[m] << endl;
    return 0;
}

货币系统

题目要求

题目描述:

image.png

输入格式:

image.png

输出格式:

输出文件共有 T 行,对于每组数据,输出一行一个正整数,表示所有与 ( n , a )等价的货币系统 ( m , b )  中,最小的 m 。

数据范围:

1n100,

1a[i]25000,

1T20

输入样例:

2 
4 
3 19 10 6 
5 
11 29 13 19 17 

输出样例:

2
5

思路分析

image.png

代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 25010;
int w[N];
int f[N];
int main()
{
    int T;
    cin >> T;
    while (T -- )
    {
        int n;
        cin >> n;
        for (int i = 1; i <= n; i ++ ) cin >> w[i];
        sort(w + 1, w + n + 1);
        memset(f, 0, sizeof f);
        f[0] = 1;
        int m = w[n];
        int res = 0;
        for (int i = 1; i <= n; i ++ )
        {
            if (!f[w[i]]) res ++;
            for (int j = w[i]; j <= m; j ++ )
                f[j] += f[j - w[i]];
        }
        cout << res << endl;
    }
    return 0;
}





目录
相关文章
|
3月前
|
算法 JavaScript Java
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
|
3月前
|
算法 测试技术 C++
【动态规划】【前缀和】【数学】2338. 统计理想数组的数目
【动态规划】【前缀和】【数学】2338. 统计理想数组的数目
|
3月前
|
机器学习/深度学习 算法 测试技术
【动态规划】【子数组划分】【前缀和】1977. 划分数字的方案数
【动态规划】【子数组划分】【前缀和】1977. 划分数字的方案数
|
3月前
|
算法 测试技术 C++
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
|
9月前
|
算法
算法练习Day53|1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划
算法练习Day53|1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划
|
9月前
|
人工智能 算法 决策智能
动态规划之背包问题(01背包问题、完全背包问题、方案数填满型背包问题)
动态规划之背包问题(01背包问题、完全背包问题、方案数填满型背包问题)
137 1
|
9月前
|
人工智能 算法 BI
【贪心策略】区间问题、背包问题、贪心策略注意事项
【贪心策略】区间问题、背包问题、贪心策略注意事项
81 0
|
12月前
|
算法 C++
【每日算法Day 109】五大解法,带你深入了解完全背包方案数
【每日算法Day 109】五大解法,带你深入了解完全背包方案数
|
12月前
|
算法 C++ Python
【每日算法Day 91】求解数组中出现次数超过1/3的那个数
【每日算法Day 91】求解数组中出现次数超过1/3的那个数
LeetCode 1913. 两个数对之间的最大乘积差
两个数对 (a, b) 和 (c, d) 之间的 乘积差 定义为 (a * b) - (c * d) 。
54 0