以前只会写多重背包的原版,渣的不行,为了做此题不得不学习了一下,发现其实也不难,只要理解了方法就好多了(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;
}

“`

NOI题库--砝码称重V2(多重背包2^n拆分)的更多相关文章

  1. 洛谷P2347 砝码称重 【多重背包】(方案数)(经典)

    题目链接:https://www.luogu.org/problemnew/show/P2347 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入 ...

  2. 砝码称重V2

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

  3. P2347 砝码称重 (01背包)

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

  4. 洛谷P1441 砝码称重 枚举 + 01背包

    显然,n<=20, m<=4 的数据范围一眼爆搜. 直接搜索一下不用哪4个砝码,再做一遍01背包即可. 可能是本人太菜鸡,01背包部分调了半天QAQ-- #include<cstdi ...

  5. P2347 砝码称重(动态规划递推,背包,洛谷)

    题目链接:P2347 砝码称重 参考题解:点击进入 纪念我第一道没理解题意的题 ''但不包括一个砝码也不用的情况'',这句话我看成了每个砝码起码放一个 然后就做不出来了 思路: 1.这题数据很小,10 ...

  6. 51nod 1449 砝码称重 (进制思想)

    1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 现在有好多种砝码,他们的重量是 w0,w1,w ...

  7. 51nod 1837 砝码称重【数学,规律】

    题目链接:51nod 1837 砝码称重 小 Q 有 n 个砝码,它们的质量分别为 1 克. 2 克.……. n 克. 他给 i 克的砝码标上了编号 i (i = 1, 2, ..., n),但是编号 ...

  8. 洛谷P1441 砝码称重

    P1441 砝码称重 题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 输入输出格式 输入格式: 输入文件weight.in ...

  9. codevs 2144 砝码称重2

    传送门 2144 砝码称重 2  时间限制: 1 s  空间限制: 16000 KB  题目等级 : 钻石 Diamond 题解   题目描述 Description 有n个砝码,现在要称一个质量为m ...

随机推荐

  1. Android系列之网络(二)----HTTP请求头与响应头

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  2. box unboxing(装箱 拆箱) C#编程指南

    box(装箱)消耗大 box在堆栈中创建一个新的对象,性能消耗大 int i = 123; // Boxing copies the value of i into object o. object ...

  3. 使用javascript获取url中的参数

    方法一: //取url参数 var type = request("type") function request() { var query = location.search; ...

  4. 基于PXC的MySQL高可用环境简单部署

    PXC简介 Percona XtraDB Cluster(简称PXC集群)提供了MySQL高可用的一种实现方法. 1.集群是有节点组成的,推荐配置至少3个节点,但是也可以运行在2个节点上. 2.每个节 ...

  5. 12个JavaScript技巧

    转自:http://web.jobbole.com/86146/ 在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操 ...

  6. MVC ajaxSubmit上传图片

    注意事项: 1.提交form,必须引用jquery.form.min.js 2.不要使用mvc自带的Ajax.Form() 1.页面cshtml <form name="frmInpu ...

  7. 【原创】有关Silverlight中“DataGrid中单元格动态绑定ComboBox单击时数据项莫名被清除 ”的解决方案及思路。

    今天上班遇到一个很古怪的问题,搞了半天愣是没找到原因.是这样的,在Datagrid中有绑定一个ComboBox列,其不包含在 model数据中,而是单独在LoadingRow事件中去 从数据库拿数据绑 ...

  8. 小程序基础09:视图层之WXML

    1.WXML WXML是框架设计的一套标签语言,结合基础组件,事件系统,可以构建出页面的结构. 用以下的例子来看看WXML有什么能力: 1.1数据绑定 <view>{{age}}</ ...

  9. 在Linux用libcurl.a在链接的时候出错

    其实出错是因为curl链接的时候需要别的库.我用如下方法解决 1.http://curl.haxx.se/download/curl-7.45.0.tar.gz官网下载源码 2../configure ...

  10. QuickFIX/J常见问题汇总

    最近在搞QuickFIX/J,网上的资料不算很多,遇到一些简单的问题都需要google一阵才能找到解决方法,因此做点记录: 错误:Rejecting invalid message: quickfix ...