P2347 砝码称重 & P1474 货币系统 Money Systems

背包方案数模板题练习

第一道题是另一道也叫做“砝码称重”的前置技能,第二道题是我搜背包方案数的时候出来的。

两道题有一点区别,就是多重(01)背包和完全背包。

第一道题因为数据水,所以多重背包也能过。但是也要学会如何写多重背包!!!

第二道题是完全背包,每一种货币可以拿无穷多次。

这种背包可以理解为价值为0,只有重量。

直接给代码:

第一份的:

#include<cstdio>

const int b[] = {0, 1, 2, 3, 5, 10, 20};
int a[7];
int weight[100005], tot;
int dp[100005];
int sum;

int main()
{
    for(int i = 1; i <= 6; i++)
    {
        scanf("%d", &a[i]);
        for(int j = 1; j <= a[i]; j++)
        {
            weight[++tot] = b[i];
        }
        sum += a[i] * b[i];
    }
    dp[0] = 1;
    for(int i = 1; i <= tot; i++)
    {
        for(int j = sum; j >= weight[i]; j--)
        {
            dp[j] += dp[j - weight[i]];
        }
    }
    int ans = 0;
    for(int i = 1; i <= sum; i++) if(dp[i]) ans++;
    printf("Total=%d\n", ans);
    return 0;
}

第二份的:

#include<cstdio>

#define ll long long
const int maxv = 26, maxn = 10005;
ll weight[maxv];
ll dp[1000005];
int v, n;
int main()
{
    scanf("%d%d", &v, &n);
    for(int i = 1; i <= v; i++)
    {
        scanf("%lld", &weight[i]);
    }
    dp[0] = 1;
    for(int i = 1; i <= v; i++)
    {
        for(int j = weight[i]; j <= 10000; j++)
        {
            dp[j] += dp[j - weight[i]];
        }
    }
    printf("%lld\n", dp[n]);
    return 0;
}

原文地址:https://www.cnblogs.com/Garen-Wang/p/9800949.html

时间: 2024-08-17 14:16:06

P2347 砝码称重 & P1474 货币系统 Money Systems的相关文章

洛谷P2347 砝码称重 [2017年4月计划 动态规划01]

P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个) 输出格式: 输出方式:Total=N (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况) 输入输出样例 输入样例#1: 1 1 0 0 0 0 输出样例#1: Total=3 暴力算法略,这里只讲dp.背包问题,每个砝码选或

洛谷 P2347 砝码称重

P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个) 输出格式: 输出方式:Total=N (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况) 输入输出样例 输入样例#1: 复制 1 1 0 0 0 0 输出样例#1: 复制 Total=3思路:搜索 #include<map

P2347 砝码称重-DP方案数-bitset

P2347 砝码称重 DP做法 : 转化为 01背包. 进行方案数 更新.最后统计种类. #include<bits/stdc++.h> using namespace std; #define maxn 1234 int n,k,dp[maxn],len,sum,ans; int a[11]= {0,1,2,3,5,10,20}; vector<int>p; int main() { for(int i=1; i<=6; i++) { scanf("%d"

洛谷P1474 货币系统 Money Systems

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

洛谷 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,等等其它.

P1474 货币系统 Money Systems(完全背包)(大水题)

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

P2347 砝码称重

题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个) 输出格式: 输出方式:Total=N (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况) 输入输出样例 输入样例#1: 1 1 0 0 0 0 输出样例#1: Total=3 #include<cstdio> int c[8],k,b[8

洛谷——P2347 砝码称重

https://www.luogu.org/problem/show?pid=2347#sub 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个) 输出格式: 输出方式:Total=N (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况) 输入输出样例 输入样例#1: 1 1 0 0 0 0 输出样