【题解】luogu P5020 货币系统

题目链接 https://www.luogu.org/problem/P5020

玄学题目。。。。可以用筛表,动规,搜索做

筛表

从小到大枚举,筛掉可以表示出来的数,剩下的数就是必须要选的(也就是答案)。

#include<bits/stdc++.h>
using namespace std;
int dp[25005], t, a[105], n, sum;
int main()
{
    cin >> t;
    while(t--)
    {
        memset(a, 0, sizeof(a));
        memset(dp, 0, sizeof(dp));
        sum = 0;
        cin >> n;
        for(int i = 1; i <= n; i++)
        {
            cin >> a[i];
            dp[a[i]] = 2;
        }
        sort(a+1, a+1+n);
        for(int i = 1; i <= a[n]; i++)
        {
            if(dp[i] > 0)
            {
                for(int j = 1; j <= n; j++)
                    if(i+a[j] <= a[n])
                        dp[i+a[j]] = 1;
                    else break;
            }
        }
        for(int i = 1; i <= a[n]; i++)
            if(dp[i] == 2) sum++;
        cout << sum << endl;
    }
    return 0;
}

动态规划

/*
状态 m, dp[i]
dp[i]代表面值为i的纸币最多有几种表示
注意这是个刚好装满的完全背包问题(注意初始化)
dp[i] = max(dp[i], dp[i-a[i]]+1);
*/

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[105], n, q[30000], t, ans;
int main()
{
    cin >> t;
   while(t--)
   {
           ans = 0;
           memset(q,-63,sizeof q);
        cin >> n;
        for(int i = 1; i <= n; i++)
            cin >> a[i];
        q[0]=0;
        for(int i = 1; i <= n ; i++)
            for(int j = a[i]; j <= 25005; j++)
                q[j] = max(q[j], q[j-a[i]]+1);
        for(int i = 1; i <= n; i++)
            if(q[a[i]] == 1) ans++;
        cout << ans << endl;
   }

    return 0;
}

启示:刚好装满问题中
1.将dp[i] 初始化为-inf ,dp[i] = max(dp[i], dp[i-a[i]]+1);
2.没有初始化dp[i],需要再加一层循环,极大的增加复杂度。

//记忆化搜索#include<bits/stdc++.h>
using namespace std;
int a[105], cnt, vis[25005], ans, t, x, n, f[25005];
void dfs(int now, int sum, int x)
{
    for(int i = x; i <= n; i++)
    {
        if(a[i]+now <= a[n] && !vis[now+a[i]])
        {
            vis[now+a[i]] = 1;
            f[now+a[i]] = sum;
            dfs(now+a[i], sum+1, i);
        }
    }

}

int main()
{
    cin >> t;
    while(t--)
    {
        ans = 0;
        memset(a, 0, sizeof(a));
        memset(f, 0, sizeof(f));
        memset(vis, 0, sizeof(vis));
        cin >> n;
        for(int i = 1; i <= n; i++)
            cin >> a[i];
        sort(a+1, a+1+n);
        dfs(0, 0, 1);
        for(int i = 1; i <= n; i++)
            if(f[a[i]] == 0) ans++;
        cout << ans << endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/lovezxy520/p/11333428.html

时间: 2024-09-30 22:53:09

【题解】luogu P5020 货币系统的相关文章

Luogu P5020 货币系统

Luogu P5020 货币系统 先把\(a\)数组排一下序. 从最小的数开始选,显然最小这个数必须选,然后利用完全背包的思想,从\(a_i\)到最大值筛选一遍,将可以组成的打上标记. 在判断后面的数字时,如果已经被标记过了,就不再选,没有被标记过就标记一下,再筛选一次数(即再做一次完全背包). #include<bits/stdc++.h> #define N 110 #define A 25010 using namespace std; int t,n,ans,mmax; int a[N

P5020 货币系统

题目描述 在网友的国度中共有 nn 种不同面额的货币,第 ii 种货币的面额为 a[i]a[i],你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为 nn.面额数组为 a[1..n]a[1..n] 的货币系统记作 (n,a)(n,a). 在一个完善的货币系统中,每一个非负整数的金额 xx 都应该可以被表示出,即对每一个非负整数 xx,都存在 nn 个非负整数 t[i]t[i] 满足 a[i] \times t[i]a[i]×t[i] 的和为 xx.然而, 在网友的国度中,货币系统可能是

[2018TG]货币系统

[Time Gate] https://www.luogu.org/problem/P5020 [解题思路] 3 10 19 6等价于3 10 这是因为19=10+3+3+3 6=3+3 看起来我们要把能够被其他钱凑出来的数给筛掉,这样一来剩下的就是我们必须要保留的面值了 那我们可以建一个数组mon[i],来存面值为i的钱能不能被其它面值的钱凑出来 最后再把整个mon跑一遍,看看原货币系统中剩下几个不能被凑出来的钱,这就是答案了 [code] 1 #include <cstdlib> 2 #i

洛谷P1474 货币系统 Money Systems

P1474 货币系统 Money Systems 250通过 553提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单位面值组成的. 母牛想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值. 举例来说, 使用一个货币系统 {1

【USACO 2.3.4】货币系统

[描述] 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单位面值组成的. 母牛想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值. 举例来说, 使用一个货币系统 {1,2,5,10,...}产生 18单位面值的一些可能的方法是:18x1, 9x2, 8x2+2x1, 3x5+2+1,等等其它. 写一个程序来计算有多少种方法用给定的货币系统来构

P1474 货币系统 Money Systems

P1474 货币系统 Money Systems 题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单位面值组成的. 母牛想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值. 举例来说, 使用一个货币系统 {1,2,5,10,...}产生 18单位面值的一些可能的方法是:18x1, 9x2, 8x2+2x1, 3x5+2+1,等等其它.

【动态规划】货币系统问题

[动态规划]货币系统问题 时间限制: 1 Sec  内存限制: 64 MB 题目描述 货币是在国家或经济体内的物资与服务交换中充当等价物,或是偿还债务的特殊商品,是用作交易媒介.储藏价值和记账单位的一种工具.魔法世界的货币的历史,可以追溯至史前以物易物的阶段,后来经过金属货币.金银.纸币以及金银本位制度,演化至现代的货币体系,现已知魔法世界的货币系统有V种面值,求组成面值为N的货币有多少种方案. 输入 第一行为两个整数V和N,V是货币种类数目,1≤V≤25,N是要构造的面值,1≤N≤1000.第

洛谷 P1474 [USACO2.3]货币系统 Money Systems

题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单位面值组成的. 母牛想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值. 举例来说, 使用一个货币系统 {1,2,5,10,...}产生 18单位面值的一些可能的方法是:18x1, 9x2, 8x2+2x1, 3x5+2+1,等等其它. 写一个程序来计算有多少种方法用给定的货币系统来构

洛谷 P1474 货币系统 Money Systems

P1474 货币系统 Money Systems 题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单位面值组成的. 母牛想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值. 举例来说, 使用一个货币系统 {1,2,5,10,...}产生 18单位面值的一些可能的方法是:18x1, 9x2, 8x2+2x1, 3x5+2+1,等等其它.