以前只会写多重背包的原版,渣的不行,为了做此题不得不学习了一下,发现其实也不难,只要理解了方法就好多了(PS:其实和倍增挺像的)

8756:砝码称重V2
总时间限制: 1000ms 内存限制: 65536kB
描述
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=100,000),要求:计算用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况。
输入
一行,包括六个正整数a1,a2,a3,a4,a5,a6,表示1g砝码有a1个,2g砝码有a2个,……,20g砝码有a6个。相邻两个整数之间用单个空格隔开。
输出
以“Total=N”的形式输出,其中N为可以称出的不同重量的个数。
样例输入
1 1 0 0 0 0
样例输出
Total=3
提示
样例给出的砝码可以称出1g,2g,3g三种不同的重量。

多重背包的2^n拆分,就是把一种多份的物体分解成几种价值高的物体来进行01背包就好,举个栗子:
**对于数量为 n 的同种物品 k 价值为 v
可以拆分打包为 1 , 2 , 4 , 8 , 16 …… ,2^x , n的剩余数量
价值为 v , 2*v ……
例如 32 个 价值为 2 的物品可以拆为
1个价值为 1*2 的物品,
1个价值为 2*2 的物品,
1个价值为 4*2 的物品,
1个价值为 8*2 的物品,
1个价值为 16*2 的物品,
1个价值为 31*2 的物品,
用这6个物品可以组合出原先32个物品的所有状态**

下面是代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1000100]={0};
int f[1000100]={0};
int zz=0;
int value[7]={0,1,2,3,5,10,20};
int fm[7]={0};
int sum=0;
int total=0;
const int cf[] = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072};
//以二为底的指数为i的值
void fj(int ki,int valuei)//二进制分解的过程
{int i=0;while (cf[i] <= ki) {a[++zz]=cf[i]*valuei;//zz是一个指针,指向当前地址 ki-=cf[i];i++;}if (ki > 0)a[++zz]=ki*valuei;
}int main()
{int i,j;for (i=1;i<=6;i++){scanf("%d",&fm[i]);sum+=fm[i]*value[i];//最高价值 fj(fm[i],value[i]);}f[0]=1;for (i=1;i<=zz;i++)for (j=sum; j>=a[i];j--) f[j]=f[j] || f[j - a[i]];//只是一个普通的01背包 for (i=1;i<=sum;i++)if (f[i]) total++;printf("%s%d","Total=",total);return 0;
}

“`

转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5346273.html

NOI题库--砝码称重V2(多重背包2^n拆分)相关推荐

  1. NOI-砝码称重v2 多重背包 生成函数

    描述  设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=100,000),要求:计算用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况. 输入  一行,包括六个正 ...

  2. 蓝桥杯每日真题之砝码称重(01背包)

    题面来源 2021年蓝桥省赛第一场G题 题面连接:http://acm.mangata.ltd/p/P1482 考点 01背包,动态规划 视频讲解 https://www.bilibili.com/v ...

  3. 【OJ8756】砝码称重V2,可达性多重背包

    砝码称重V2 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=100,000),要求:计 ...

  4. 智力题:砝码称重问题

    第一题 假设有280g食盐,有一架天平,有两个砝码,分别是14g,4g.请问能否在3次内将280g食盐分为100g和180g两堆,请详细描述你的解决方法 解法一: 第一次:平分280g的食盐:140g ...

  5. 【题解】【蓝桥杯】试题 历届真题 砝码称重【第十二届】【省赛】【B组】

    题目链接 试题 历届真题 砝码称重[第十二届][省赛][B组] 题目描述 解题思路 暴力,两个map,分别存储当前能称出的重量和遍历时用于计算的重量 需要注意的三点是 abs函数是在math.h里面的 ...

  6. Bailian4141 砝码称重【DP】

    4141:砝码称重 总时间限制: 1000ms 内存限制: 65536kB 描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000),要求:计算用这些砝码能称出的不同 ...

  7. 51NOD 1449 砝码称重(贪心+进制思想)

    题目连接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1449 1449 砝码称重 题目来源: CodeForces 基 ...

  8. 第十二届蓝桥杯省赛 C/C++大学B组 试题G:砝码称重

    试题题目: 本题为编程题第二题 解题思路: 方法一:暴力求解 1.分析    首先利用数组W[N]W[N]W[N]记录NNN块砝码的质量.    模拟放取过程.先取第一块砝码放在天平上,再取第二块砝码 ...

  9. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-936 砝码称重

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-936 砝码称重 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-936 砝码称重 前言 关于数学的疑问 算法训练 砝码称重 ...

  10. 【蓝桥杯-砝码称重】

    蓝桥杯-砝码称重 问题描述: 你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1, W2, · · · WN 请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边 输入的第一行包含 ...

最新文章

  1. PyTorch | 优化神经网络训练的17种方法
  2. SAP MM Transportation of PR Release Strategy with Classification
  3. 6、WHERE:条件查询数据
  4. bilibili源码_Java开源商城源码推荐,从菜鸡到大神,永远绕不开的商城系统
  5. python 消息队列 get是从队首还是队尾取东西_从零开始Python对redis作为消息队列的使用...
  6. Vue CLI 3.0正式发布!
  7. linux bash readline,Bash readline 使用技巧
  8. C# 操作offfice权限问题
  9. 第十二章 演员评论家(Actor-Critic)-强化学习理论学习与代码实现(强化学习导论第二版)
  10. Eureka的自我保护模式
  11. Excel如何快速方便生成随机姓名
  12. 单片机c语言实验报告心得,关于单片机实训心得体会
  13. Python 重新加载模块
  14. mysql索引类型及方法介绍
  15. word中如何设置默认英文字体和中文字体
  16. 移动端h5框架自适应_Html5移动端页面自适应百分比布局
  17. 用AI「复活」逝者:「深度怀旧」项目火遍推特,我们也用民国老照片试了下 #蚂蚁呀嘿
  18. Real-time signal
  19. HTML 樱花飘落界面效果
  20. OpenCL Installable Client Driver (ICD) Loader编译

热门文章

  1. 约束最优化方法 (四) 乘子法
  2. What is DevOps?
  3. 1、和一定时找数组中的两个数
  4. 自适应方案比较及案例
  5. 2016.10.26
  6. [转]关于c#winform禁用关闭按钮的方法
  7. Java异常Error和Exception
  8. linux 编译,链接和加载
  9. bzoj 3165: [Heoi2013]Segment 线段树
  10. Node.js的集群功能以及在Express的配置