题目链接: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. AWS EC2中部署Apache服务器(LAMP)

    关键词: 1.新建aws ec2实例 2.使用putty连接到aws ec2 实例(SSH协议) 3.使用filezilla连接到aws ec2实例(SFTP协议) 4.在aws ec2上部署apac ...

  2. strcpy(转载)

    转自:http://www.kuqin.com/clib/string/strcpy.html 原型:extern char *strcpy(char *dest,char *src); 用法:#in ...

  3. POJ3682;King Arthur's Birthday Celebration(期望)

    传送门 题意 进行翻硬币实验,若k次向上则结束,进行第n次实验需花费2*n-1的费用,询问期望结束次数及期望结束费用 分析 我们令f[i]为结束概率 \[f[i]=C_{i-1}^{k-1}*p^k* ...

  4. bzoj 3555: [Ctsc2014]企鹅QQ【hash+瞎搞】

    首先注意 先hash一下,双hash,然后枚举删去位置,把hash值排个序,把些相等的加起来统计一下对数即可 #include<iostream> #include<cstdio&g ...

  5. bzoj 1007: [HNOI2008]水平可见直线【半平面交】

    其实并不算标准半平面交?但是思路差不多 先按照斜率排序,然后用栈维护凸壳,每遇到重斜率或a[i],s[top-1]交点的x轴在s[top],s[top-1]交点左侧,则说明s[top]被a[i],s[ ...

  6. WPF-按钮美化

    我们不多哔哔,先放图: 美化按钮背景: 当我们用系统默认的按钮风格似乎太老套,而且不太美观,某些情况下我们需要对按钮进行美化和重绘,只有这样才能满足我们的需要 按钮美化思维引导: 图中1 为控件Bor ...

  7. iOS 计算字符串显示宽高度

    ObjC(Category of NSString): - (CGSize)getSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size{ ...

  8. B - Burning Midnight Oil CodeForces - 165B

    One day a highly important task was commissioned to Vasya — writing a program in a night. The progra ...

  9. Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)

    题目链接: Hdu 3289 Rain on your Parade 题目描述: 有n个客人,m把雨伞,在t秒之后将会下雨,给出每个客人的坐标和每秒行走的距离,以及雨伞的位置,问t秒后最多有几个客人可 ...

  10. 【图片匹配】--- SIFT_Opencv3.1.0_C++_ubuntu

    最近在捣鼓图片相似性匹配算法.这里先说一点必要的题外话: 如果是在同一个object不同角度拍摄的多张图片中,使用SIFT可以有不错的效果: 如果是寻找类别相同的图片(可能不是同一object),SI ...