题目链接:P2347 砝码称重

参考题解:点击进入

纪念我第一道没理解题意的题

''但不包括一个砝码也不用的情况'',这句话我看成了每个砝码起码放一个

然后就做不出来了

思路:

1.这题数据很小,1000,所以其实没必要把多重背包用二进制优化成01背包,直接一个个拆开就好了

2.建立数组f[2000],用来f[j]=1表示存在重量为j这种可能,f[j]=0则表示不存在这种可能

建立数组a[2000],用来把多重背包一个个拆开

比如说我们输入的是3  4  0 0

那a就是{1,1,1,2,2,2,2,,}

数组f其实是用了"桶"的思想

数组start存一开始每个砝码的意义,这个就不用说了

3.对于输入数据和存入a数组那一步其实是一块完成的

int temp_n,t=;
for(int i=;i<=;i++)
{
cin>>temp_n;
for(int j=;j<=temp_n;j++) a[++t]=start[i];
}

4.边缘条件的定义  f[a[1]]=1;,这样i到时候直接从2开始

5.具体的递推过程

for(int i=;i<=t;i++)
for(int j=;j>=;j--)
if(f[j])
f[j+a[i]]=,f[a[i]]=;

i=2~t表示遍历全部的砝码

j=1000~0表示遍历全部的重量,注意是j--,j是必须要下降的,如果从前面开始,那么

f[j+a[i]]=1的赋值可能会影响到后面的if(f[j])的判断

另外一个层面的理解就是从前往后可能就会出现把一个砝码放两次的情况,违背了我们刚刚拆分的01背包

6.最后把f数组扫一遍,每有一次true就ans++,然后ans就是答案

AC代码:

#include<bits/stdc++.h>
using namespace std;
bool f[];
int a[];
int main()
{
std::ios::sync_with_stdio(false);
int start[]={,,,,,,}; int temp_n,t=;
for(int i=;i<=;i++)
{
cin>>temp_n;
for(int j=;j<=temp_n;j++) a[++t]=start[i];
}
f[a[]]=;
for(int i=;i<=t;i++)
for(int j=;j>=;j--)
if(f[j])
f[j+a[i]]=,f[a[i]]=;
int ans=;
for(int i=;i<=;i++)
if(f[i])
ans++;
printf("Total=%d",ans);
return ;
}

P2347 砝码称重(动态规划递推,背包,洛谷)的更多相关文章

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

    P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...

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

    P2347 砝码称重 DP做法 : 转化为 01背包. 进行方案数 更新.最后统计种类. #include<bits/stdc++.h> using namespace std; #def ...

  3. P2347 砝码称重

    P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...

  4. 洛谷 P2347 砝码称重

    P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...

  5. NOI题库--砝码称重V2(多重背包2^n拆分)

    以前只会写多重背包的原版,渣的不行,为了做此题不得不学习了一下,发现其实也不难,只要理解了方法就好多了(PS:其实和倍增挺像的) 8756:砝码称重V2 总时间限制: 1000ms 内存限制: 655 ...

  6. 【KMP】【矩阵加速】【递推】洛谷 P3193 [HNOI2008]GT考试 题解

        看出来矩阵加速也没看出来KMP…… 题目描述 阿申准备报名参加 GT 考试,准考证号为\(N\)位数\(X_1,X_2…X_n(0\le X_i\le9)\),他不希望准考证号上出现不吉利的数 ...

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

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

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

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

  9. 【题解】Luogu P2347 砝码称重

    正经·DP题解 一道非常好的背包练手题( sto(注:原思路来源 SLYZ_0120 的题解)orz 开始这道题 1.输入六个数,存进数组中 2.初始化 f 数组为0. f [ i ] 表示重量为 i ...

随机推荐

  1. Pascal输出星星

    program Project2; {$APPTYPE CONSOLE} uses SysUtils; var i,j:integer; begin { TODO -oUser -cConsole M ...

  2. (转)ASP.NET 4.0 尚未在 Web 服务器上注册

    安装vs2010的时候忘记先安装IIS7了,导致出现了这个问题.经过网络查询发现解决方法如下: 运行:cmd命令,进入命令管理器, 输入:cd C:\\WINDOWS\\Microsoft.NET\\ ...

  3. Phpspy 2011继续身份验证绕过漏洞

    Author: Tm3yShell7 官方目前下载已经修补上了 目前官方下载是2011.php, 文件名为2011ok.php的是带洞版本. 今天m0r5和我说phpspy2011 我都不知道2011 ...

  4. LUR和缺页次数

    缺页:缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问. LRU(Least recently used)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问 ...

  5. 部分安卓微信浏览器无法触发onchange事件

    这是安卓微信的一个遗留问题. 解决办法很简单: 将input标签 <input type=“file" name="image" accept="imag ...

  6. Styles and Themens(1)详述

    Styles and Themes IN THIS DOCUMENT Defining Styles Inheritance Style Properties Applying Styles and ...

  7. Java 线程实例 刷碗烧水和倒计时

    线程——烧水刷碗和倒计时实例 (一)烧水刷碗 刷碗的同时烧水:下面是碗的程序: 下面是烧水的程序:在水的实现类中,调用了Thread线程,让烧水刷碗同时进行. 注意:刷碗2s一次,烧水10s (二)1 ...

  8. SpringMVC -- 必知必会

    SpringMVC基于模型--视图--控制器(Model-View-Controller,MVC)模式实现,属于SpringFrameWork的后续产品,已经融合在SpringWebFlow里面.它通 ...

  9. html5改良的input元素的种类

    1.url类型.email类型.date类型.time类型.datetime类型.datetime-local类型. month类型.week类型.number类型.range类型.search类型. ...

  10. colormap画出的图不是彩色问题

    针对matlab2017渲染出的彩色图是黑白的问题. t=labels; t(tstSet(:,end-))=Relabels; t=reshape(t,,); t=t'; figure imshow ...