P2347 砝码称重 (01背包)

题目描述

设有 1g1g1g 、 2g2g2g 、 3g3g3g 、 5g5g5g 、 10g10g10g 、 20g20g20g 的砝码各若干枚(其总重 ≤1000 \le 1000≤1000 ),

输入输出格式

输入格式:

输入方式: a1,a2,a3,a4,a5,a6a_1 , a_2 ,a_3 , a_4 , a_5 ,a_6a1?,a2?,a3?,a4?,a5?,a6?

(表示 1g1g1g 砝码有 a1a_1a1? 个, 2g2g2g 砝码有 a2a_2a2? 个,…, 20g20g20g 砝码有 a6a_6a6? 个)

输出格式:

输出方式: Total=NTotal=NTotal=N

( NNN 表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)

输入输出样例

输入样例#1: 复制

1 1 0 0 0 0

输出样例Total=3

其实题目中有  “其总重 ≤1000”,这句提示了怎样做的。

题目是,有n个m克的砝码问可以称量多少个重量。其实就是一个方案背包。我们利用了,当背包中有方案数时,就可以说明这些砝码可以表示这个重量,而方案数不是我们关心的。那么,当有方案数时,就ans++.当,将n个m克砝码看做,n个重量为m的物品,这样不就转化为01方案背包了嘛。背包总量为所有和sum。

ac代码如下:
#include<cstdio>
#define MAXN int(1e6+10)
int dp[MAXN];
int w[MAXN];
int a[] = { 0,1,2,3,5,10,20 };
int main()
{
    int n = 0, k;
    for (int i = 1; i <= 6;++i)
    {
        scanf("%d", &k);
        for (int j = 1; j <= k; ++j)
            w[++n] = a[i];
    }
    int v = 0;
    for (int i = 1; i <= n; ++i)
        v += w[i];
    dp[0] = 1;
    for (int i = 1; i <= n;++i)
    for (int j = v; j >= w[i]; --j)
        dp[j] += dp[j - w[i]];
    int ans = 0;
    for (int i = 1; i <= v;++i)
    if (dp[i])++ans;
    printf("Total=%d\n", ans);
}
 

原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/9460824.html

时间: 2024-10-08 14:26:15

P2347 砝码称重 (01背包)的相关文章

洛谷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 砝码称重-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"

洛谷 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 砝码称重 &amp; P1474 货币系统 Money Systems

背包方案数模板题练习 第一道题是另一道也叫做"砝码称重"的前置技能,第二道题是我搜背包方案数的时候出来的. 两道题有一点区别,就是多重(01)背包和完全背包. 第一道题因为数据水,所以多重背包也能过.但是也要学会如何写多重背包!!! 第二道题是完全背包,每一种货币可以拿无穷多次. 这种背包可以理解为价值为0,只有重量. 直接给代码: 第一份的: #include<cstdio> const int b[] = {0, 1, 2, 3, 5, 10, 20}; int a[7

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 输出样

背包DP——砝码称重(未完结)

砝码称重 内存限制:128 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000g).求出用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况. 输入格式 只有一行,共有六个数,一次为1g.2g.3g.5g.10g.20g砝码的个数 输出格式 只有一行,为称出不同重量的个数 样例 样例输入 1 1 0 0 0 0 样例输出 Total=3 原文地址:https://www.c

【练习】砝码称重

P1441 砝码称重 思路:dfs枚举去掉哪些砝码, 01背包求方案数, 各种情况取max记为ans输出√ 边界情况处理不好交了三遍QAQ dp[j] = dp[j] + dp[j - a[i]] 选上这个砝码的情况+ 不选的情况 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 const int sz = 2020; 6 int n, m, ans

1449 砝码称重

1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 现在有好多种砝码,他们的重量是 w0,w1,w2,...  每种各一个.问用这些砝码能不能表示一个重量为m的东西. 样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中. Input 单组测试数据. 第一行有两个整数w,m (2 ≤ w ≤ 10^9, 1 ≤ m ≤ 10^9). Output 如果能,输出YES,否则输出NO. Input示例