题目描述

Bessie像她的诸多姊妹一样,因为从Farmer John的草地吃了太多美味的草而长出了太多的赘肉。所以FJ将她置于一个及其严格的节食计划之中。她每天不能吃多过H ( <= H <= ,)公斤的干草。 Bessie只能吃一整捆干草;当她开始吃一捆干草的之后就再也停不下来了。她有一个完整的N ( <= N <= )捆可以给她当作晚餐的干草的清单。她自然想要尽量吃到更多的干草。很自然地,每捆干草只能被吃一次(即使在列表中相同的重量可能出现2次,但是这表示的是两捆干草,其中每捆干草最多只能被吃掉一次)。 给定一个列表表示每捆干草的重量S_i ( <= S_i <= H), 求Bessie不超过节食的限制的前提下可以吃掉多少干草(注意一旦她开始吃一捆干草就会把那一捆干草全部吃完)。

输入输出格式

输入格式:
* 第一行: 两个由空格隔开的整数: H 和 N * 第2到第N+1行: 第i+1行是一个单独的整数,表示第i捆干草的重量S_i。 输出格式:
* 第一行: 一个单独的整数表示Bessie在限制范围内最多可以吃多少公斤的干草。 输入输出样例 输入样例#: 复制 输出样例#: 复制 说明 输入说明: 有四捆草,重量分别是15, , 20和21。Bessie在56公斤的限制范围内想要吃多少就可以吃多少。 输出说明: Bessie可以吃3捆干草(重量分别为15, , )。恰好达到她的56公斤的限制。

看完题面,应当瞬间判断01背包(搜索超时了)想到记忆化~dp

这个题相对01少了费用,变成了体积,于是就变成了区间最优体积(体积即费用的地位)

下面是代码

 #include<iostream>      //头文件
using namespace std;
int n,m,a[],b[],f[]={}; //要注意数据范围
int main()
{
cin>>n>>m;
for(int i=;i<=m;i++)
{
cin>>a[i]; //输入每一捆干草的数量
}
for(int i=;i<=m;i++)
{
for(int j=n;j>=a[i];j--)
{
if(f[j]<=f[j-a[i]]+a[i])f[j]=f[j-a[i]]+a[i]; //因为数据过大,所以要记得优化成一维的
}
}
cout<<f[n]<<endl; //输出结果
return ;
}

现在问题集中在11-17行

即滚动数组优化和j的倒叙枚举

用一个表格模拟下

搜索代码的话

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<cstdlib>
#include<fstream>
#define maxn 868800
using std::cin;using std::cout;using std::endl;using std::max;using std::min;
int m,n,k,l,a,b,c,v[maxn],f[maxn];
void dfs(int i,int j)
{
if(j>m)
return ;
f[j]=;
if(i==n+)
return ;
dfs(i+,j+v[i]);
dfs(i+,j);
}
int main()
{
cin>>m>>n;
for(int i=;i<=n;i++)
cin>>v[i];
dfs(,);
for(int i=m;i>=;i--)
if(f[i]==)
{
cout<<i<<endl;
return ;
}
return ;
}

0        
         
         
         
         

从第一个开始选,从00开始推有

f(i,j)=max(f(i-1,j-a[i]),f(i-1,j));

f(i%2,j)=max(f(1^i%2,j-a[i]),f(1^i%2,j));

这个没什么问题吧

i是从1开始的,所以一开始给出的应该是f(1,m)=0;

所以j是从m开始推出来的

也就是说i,j是确定的状态;

所以向下推;

不会导致错误;

我们再看看完全背包

下篇吧

通过洛谷P2639看01背包的更多相关文章

  1. 洛谷 P1858 多人背包 DP

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 洛谷 P1858 多人背包 题目描述 求01背包前k优解的价值 ...

  2. [洛谷P2113] 看球泡妹子

    洛谷题目链接:看球泡妹子 题目背景 2014年巴西世界杯开幕了,现在满城皆是世界杯,商家们利用它大赚一笔,小明和小红也借此机会增进感情. 题目描述 本届世界杯共有N支球队,M场比赛.男球迷小明喜欢看比 ...

  3. [洛谷P1858] 多人背包

    洛谷题目链接:多人背包 题目描述 求01背包前k优解的价值和 输入输出格式 输入格式: 第一行三个数K.V.N 接下来每行两个数,表示体积和价值 输出格式: 前k优解的价值和 输入输出样例 输入样例# ...

  4. 洛谷 P1858 多人背包

    求01背包前k优解的价值和 输入输出格式 Input/output 输入格式:第一行三个数K.V.N(k<=50,v<=5000,n<=200)接下来每行两个数,表示体积和价值输出格 ...

  5. 【洛谷】【动态规划/背包】P1833 樱花

    [题目描述:] 爱与愁大神后院里种了n棵樱花树,每棵都有美学值Ci.爱与愁大神在每天上学前都会来赏花.爱与愁大神可是生物学霸,他懂得如何欣赏樱花:一种樱花树看一遍过,一种樱花树最多看Ai遍,一种樱花树 ...

  6. 洛谷P4138 挂饰 背包

    正解:背包dp 解题报告: 昂先放链接qwq 感觉还挺妙的,,,真的我觉得我直接做可能是想不到背包的,,,我大概想不出是个背包的QAQ 但是知道是背包之后觉得,哦,好像长得也确实挺背包的吼,而且其实是 ...

  7. 【洛谷】【动态规划/背包】P1417 烹调方案

    由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的食物准备填 ...

  8. 洛谷 P1858 多人背包 解题报告

    P1858 多人背包 题目描述 求01背包前k优解的价值和 输入输出格式 输入格式: 第一行三个数\(K\).\(V\).\(N\) 接下来每行两个数,表示体积和价值 输出格式: 前k优解的价值和 说 ...

  9. 洛谷 P2639 [USACO09OCT]Bessie的体重问题Bessie's We… 题解

    题目传送门 这也是个01背包,只是装的很... #include<bits/stdc++.h> #define MAXN 45010 using namespace std; int f[ ...

随机推荐

  1. SCUT - 290 - PARCO的因数游戏 - 博弈论

    https://scut.online/p/290 一个 N 个数的取数游戏,Kaildls 和 Parco 轮流操作,每次操作从 N 个数中取一个数 y 并把他变成 y-x(满足 x | y 且x  ...

  2. (水题)洛谷 - P1093 - 奖学金

    https://www.luogu.org/problemnew/show/P1093 #include<bits/stdc++.h> using namespace std; #defi ...

  3. 骨骼蒙皮动画(Skinned Mesh)的原理解析(二)

    http://blog.csdn.net/jimoshuicao/article/details/9283071 2)蒙皮信息和蒙皮过程 2-1)Skin info的定义 上文曾讨论过,Skinned ...

  4. Differentiation 导数和变化率

    何为导数 1 : 如何求一条直线上一点的切线? what did we learn in high school about what a tangent(切) line is ? :任意一点上的切线 ...

  5. android 显示目录下图片

    知识点 1. 网格视图 2. 读取文件 MainAcitvity package com.test.gridview; import android.support.v7.app.AppCompatA ...

  6. 【Tsinsen】A1280. 最长双回文串

    Bryce1010模板 http://www.tsinsen.com/A1280### 题目分析:记录一个点向后和向前的最长回文串,然后就是max(Llen[i]+Rlen[i+1])了. #incl ...

  7. 洛谷 P3375 【模板】KMP字符串匹配 || HDU 1686 Oulipo || kmp

    HDU-1686 P3375 kmp介绍: http://www.matrix67.com/blog/archives/115 http://www.cnblogs.com/SYCstudio/p/7 ...

  8. 贪心 Codeforces Round #304 (Div. 2) B. Soldier and Badges

    题目传送门 /* 题意:问最少增加多少值使变成递增序列 贪心:排序后,每一个值改为前一个值+1,有可能a[i-1] = a[i] + 1,所以要 >= */ #include <cstdi ...

  9. 在Android 源码中添加系统服务

    Android系统本身提供了很多系统服务,如WindowManagerService,PowerManagerService等.下面描述一下添加一个系统服务的具体步骤. 1.定义自定义系统服务接口 撰 ...

  10. selenium处理的操作