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",&k);
            for(int j=0; j<k; j++)
            {
                p.push_back(a[i]);
                sum+=a[i];
            }
        }
        dp[0]=1;
        len=p.size();
        for(int i=0; i<len; i++)
            for(int j=sum; j>=p[i]; j--)
                dp[j]+=dp[j-p[i]];
        for(int i=1; i<=sum; i++)
            if(dp[i])ans++;
        printf("Total=%d\n",ans);
        return 0;
    }
    

      

    bitset 做法 :
    因为 bitset 只能存 00 和 11 ,我们可以让第 ii 位为 11 来表示可以表示出 ii 这个值。
    bitset能对某一位赋值,我们初始定义 Bitset[0]=1Bitset[0]=1,表示可以表示出 00
    当我们加入一个新的砝码的时候,我们将这个砝码加入 bitset ,即进行如下的操作
    Bitset |= Bitset << w[i]Bitset∣=Bitset<<w[i]
    简单理解就是已有的所有能表示出的值都加上 w_iwi? 再与原集合取并集。
    最后我们统计 bitset 中有多少个 11 即可,可以使用自带函数 Bitset.count()Bitset.count() 完成。

  • #include<bits/stdc++.h>
    using namespace std;
    #define maxn 1234
    int dp[maxn];
    int a[11]= {0,1,2,3,5,10,20};
    bitset<1010>s;
    int main()
    {
        for(int i=1; i<=6; i++)scanf("%d",&dp[i]);
        s[0]=1;
        for(int i=1; i<=6; i++)
            for(int j=0; j<dp[i]; j++)
                s|=s<<a[i];
        printf("Total=%d\n",s.count()-1);
        return 0;
    }
    

      

原文地址:https://www.cnblogs.com/SDUTNING/p/10261624.html

时间: 2024-08-29 20:08:19

P2347 砝码称重-DP方案数-bitset的相关文章

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

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

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? 个,-, 20g20g

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】砝码称重

砝码称重 来源:NOIP1996(提高组)  第四题 [问题描述]     设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000),用他们能称出的重量的种类数. [输入文件]   a1  a2  a3  a4  a5  a6     (表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个,中间有空格). [输出文件]   Total=N     (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况). [输入样例]     1 1 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