【ACWing】1023. 买书

题目地址:

https://www.acwing.com/problem/content/1025/

小明手里有 n n n元钱全部用来买书,书的价格为 10 10 10元, 20 20 20元, 50 50 50元, 100 100 100元。问小明有多少种买书方案?(每种书可购买多本)

输入格式:
一个整数 n n n,代表总共钱数。

输出格式:
一个整数,代表选择方案种数。

数据范围:
0 ≤ n ≤ 1000 0≤n≤1000 0n1000

这题是完全背包求方案数问题,可以用动态规划。设 f [ i ] [ j ] f[i][j] f[i][j]是只允许买前 i i i种书,并且总价格恰好是 j j j的情况下的买书方案数。那么可以按照第 i i i种书买不买来分类,有: f [ i ] [ j ] = f [ i − 1 ] [ j ] + f [ i ] [ j − v i ] f[i][j]=f[i-1][j]+f[i][j-v_i] f[i][j]=f[i1][j]+f[i][jvi] v i v_i vi是第 i i i种书的价格。可以像完全背包一样做空间优化,只开一维数组,每行从左到右更新。代码如下:

#include <iostream>
using namespace std;

int f[1010];

int main() {
    int n;
    cin >> n;
    int a[] = {0, 10, 20, 50, 100};

    f[0] = 1;
    for (int i = 1; i <= 4; i++)
        for (int j = a[i]; j <= n; j++) 
			f[j] += f[j - a[i]];

    cout << f[n] << endl;

    return 0;
}

时空复杂度 O ( n ) O(n) O(n)

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页