P2347 砝码称重(动态规划递推,背包,洛谷)
题目链接: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 砝码称重(动态规划递推,背包,洛谷)的更多相关文章
- 洛谷P2347 砝码称重 [2017年4月计划 动态规划01]
P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...
- P2347 砝码称重-DP方案数-bitset
P2347 砝码称重 DP做法 : 转化为 01背包. 进行方案数 更新.最后统计种类. #include<bits/stdc++.h> using namespace std; #def ...
- P2347 砝码称重
P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...
- 洛谷 P2347 砝码称重
P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...
- NOI题库--砝码称重V2(多重背包2^n拆分)
以前只会写多重背包的原版,渣的不行,为了做此题不得不学习了一下,发现其实也不难,只要理解了方法就好多了(PS:其实和倍增挺像的) 8756:砝码称重V2 总时间限制: 1000ms 内存限制: 655 ...
- 【KMP】【矩阵加速】【递推】洛谷 P3193 [HNOI2008]GT考试 题解
看出来矩阵加速也没看出来KMP…… 题目描述 阿申准备报名参加 GT 考试,准考证号为\(N\)位数\(X_1,X_2…X_n(0\le X_i\le9)\),他不希望准考证号上出现不吉利的数 ...
- 洛谷P2347 砝码称重 【多重背包】(方案数)(经典)
题目链接:https://www.luogu.org/problemnew/show/P2347 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入 ...
- P2347 砝码称重 (01背包)
题目描述 设有 1g1g1g . 2g2g2g . 3g3g3g . 5g5g5g . 10g10g10g . 20g20g20g 的砝码各若干枚(其总重 ≤1000 \le 1000≤1000 ), ...
- 【题解】Luogu P2347 砝码称重
正经·DP题解 一道非常好的背包练手题( sto(注:原思路来源 SLYZ_0120 的题解)orz 开始这道题 1.输入六个数,存进数组中 2.初始化 f 数组为0. f [ i ] 表示重量为 i ...
随机推荐
- 异常处理:Cannot attach the file as database 'membership'.
Cannot attach the file 'D:\GitHome\cae\CAE\App_Data\membership.mdf' as database 'membership'. 说明: 执行 ...
- Spring IOC 一——容器装配Bean的简单使用
下文:SpringIOC 二-- 容器 和 Bean的深入理解 写在前面 这篇文章去年写的,缘起于去年某段时间被领导临时"抓壮丁"般的叫过去做java开发,然后在网上找了一个 Sp ...
- 【WIP】Swift4 异常处理, JSON处理
创建: 2018/03/24 更新: 2018/06/05 补充catch可以只带where不带模式 [任务表]TODO 异常处理语法 异常的发生 抛出例外 thorw 式 ● 抛出的值的类型必须采 ...
- ionic2 如何引入第三方cordova插件
例如:cordova-plugin-wechat 这个插件可以做微信登录,分享支付等 首先第一步:ionic plugin add cordova-plugin-wechat --variable w ...
- [App Store Connect帮助]七、在 App Store 上发行(5)手动发布版
如果在您提交您的 App 以供审核时选择手动发布某个版本,您可以在它被批准且状态更改为“等待开发者发布”后发布该版本.如果您的某个 App 处于“等待开发者发布”状态超过 30 天,您会收到来自 Ap ...
- iOS NSDictionary <--> NSString(JSON) in Objc
NSDictionary --> NSString + (NSString*)stringINJSONFormatForObject:(id)obj { NSData *jsonData = [ ...
- pycharm版本选择并安装
pycharm版本选择并安装 一. 初学python最好选择专业版的,因为经测试社区版的很多插件都没有安装,如果自己安装的话会非常麻烦,而且很多根本就安装不上,比如说css,javascript,d ...
- poj 3281 Dining (最大网络流)
题目链接: http://poj.org/problem?id=3281 题目大意: 有n头牛,f种食物,d种饮料,第i头牛喜欢fi种食物和di种饮料,每种食物或者饮料被一头牛选中后,就不能被其他的牛 ...
- Android偏好设置(4)设置默认值
Setting Default Values The preferences you create probably define some important behaviors for your ...
- foreach的学习使用归纳
1: 实现对双向链表的遍历使用 LinkedList<string> llary = new LinkedList<string>(); llary.AddLast (&quo ...