CodeForces 366C 动态规划 转化背包思想
这道题目昨晚比赛没做出来,昨晚隐约觉得就是个动态规划,但是没想到怎么DP,今天想了一下,突然有个点子,即局部最优子结构为 1-j,j<i,遍历i,每次从所有的1到j当中的最优解里面与当前商品进行匹配,若匹配成功,遍判断是否要加。。。。结果WA了,想了一下,确实不对,因为题目的限制条件是所有美味值的总和除以所有卡路里总和一定要==k,这个就好麻烦了,根本不是我定义的那种子结构最优即可,任意后面的状态都可影响前面,所以规划方向无法确定。。。其实这个时候就应该想到用背包问题,背包也是商品挑选,但规划方向无法确定。。。所以通过这个题目,意识到了背包的强大,把上一阶段的所有可能值,下一阶段再进行最优择选,但同时保留所有可能值,以此来防止漏掉情况
其实代码我是看了一个博客之后才写出来的
首先就是要解决==k这个问题,在背包里面怎么表示==k,其实可以转化为 a[i]-k*b[i]==0,也就是说,最终背包的结果就是背包值为0的时候,但是由于这个相减的值可能为负数,所以只能人工+N,以N代替0。
以dp[i][j]表示在第i件物品,在第j个状态(即a[i]-k*b[i])(当然人工+N了)的最大美味值。
则每件物品的时候,遍历整个背包,把所有可能情况都保留下来。
最后只要 dp[n][N]就是结果
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100000
#define INF -900000
using namespace std;
int dp[][N<<];
int a[];
int b[];
int n,k; int main()
{
while (scanf("%d%d",&n,&k)!=EOF)
{
int i,j;
for (i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
for (i=;i<=n;i++)
{
scanf("%d",&b[i]);
} for (i=;i<=n;i++)
{
for (j=;j<=N*;j++)
dp[i][j]=INF;
}
dp[][N]=;
int ans=-;
for (i=;i<n;i++)
{
for(j=;j<N*;j++)
{
int temp=a[i+]-k*b[i+];
if (j+temp< || j+temp>=N*) continue;
if (dp[i][j]==INF) continue;
dp[i+][j+temp]=max(dp[i+][j+temp],dp[i][j]+a[i+]);
dp[i+][j]=max(dp[i+][j],dp[i][j]);//本身的状态要记录好
}
}
if (dp[n][N]==)
ans=-;
else
ans=dp[n][N];
printf("%d\n",ans);
}
return ;
}
CodeForces 366C 动态规划 转化背包思想的更多相关文章
- Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)
传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...
- Jury Compromise POJ - 1015 dp (标答有误)背包思想
题意:从 n个人里面找到m个人 每个人有两个值 d p 满足在abs(sum(d)-sum(p)) 最小的前提下sum(d)+sum(p)最大 思路:dp[i][j] i个人中 和 ...
- Codeforces 837D 动态规划
Codeforces 837D 动态规划 传送门:https://codeforces.com/contest/837/problem/D 题意: 给你n个数,问你从这n个数中取出k个数,这k个数的乘 ...
- codeforces 1183H 动态规划
codeforces 1183H 动态规划 传送门:https://codeforces.com/contest/1183/problem/H 题意: 给你一串长度为n的字符串,你需要寻找出他的最长的 ...
- codeforces 212E IT Restaurants(树形dp+背包思想)
题目链接:http://codeforces.com/problemset/problem/212/E 题目大意:给你一个无向树,现在用两种颜色去给这颗树上的节点染色.用(a,b)表示两种颜色分别染的 ...
- codeforces 366C Dima and Salad 【限制性01背包】
<题目链接> 题目大意: 在一个水果篮里有n种水果,并且这些水果每一种都有一个美味度和一个卡路里的属性, 小明要从这些水果中选出来一些做一个水果沙拉, 并且要求他的水果沙拉的美味度是卡路里 ...
- Codeforces 946 D.Timetable-数据处理+动态规划(分组背包) 处理炸裂
花了两个晚上来搞这道题. 第一个晚上想思路和写代码,第二个晚上调试. 然而还是菜,一直调不对,我的队友是Debug小能手呀(真的是无敌,哈哈,两个人一会就改好了) D. Timetable tim ...
- Codeforces 366C Dima and Salad:背包dp
题目链接:http://codeforces.com/problemset/problem/366/C 题意: 有n个物品,每个物品有两个属性a[i]和b[i]. 给定k,让你选出一些物品,使得 ∑ ...
- CodeForces - 366C Dima and Salad (01背包)
题意:n件东西,有属性a和属性b.要选取若干件东西,使得\(\frac{\sum a_j}{\sum b_j} = k\).在这个条件下,问\(\sum a_j\)最大是多少. 分析:可以将其转化为0 ...
随机推荐
- 023、MySQL取文本长度取字符串长度
#取文本长度,一个文字算1长度 SELECT CHAR_LENGTH('田攀520'); #UTF-8的数据库,值为5 #取文本长度,汉字算多个字符,数字和英文算一个字符 SELECT LENGTH( ...
- Scala 线性化规则和 super 操作
如果一个类有多个父类,且父类的有相同的函数 f,在子类和父类中调用 super.f 都是按从右到左的调用函数的顺序. 这个规则名为:Linearization Rules 如下的代码 trait Ba ...
- Scala match 变量
昨天写 Scala 的时候,使用 match(相当于 switch)时,运行结果很奇怪. var i: Int = 0 while (i < items.length) { i % width ...
- javascript判断数组是否包含了指定的元素
jQuery写法: var arr = [ "xml", "html", "css", "js" ]; $.inArra ...
- python进阶 廖雪峰(慕课网)
1.函数式编程 变量名可以指向函数,那么函数就可以通过一个变量传递给另一个函数或者变量. map()函数:接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到 ...
- 使用conda创建虚拟环境
conda创建python虚拟环境 前言 conda常用的命令: conda list 查看安装了哪些包. conda env list 或 conda info -e 查看当前存在哪些虚拟环境 co ...
- E. MaratonIME does (not do) PAs
E. MaratonIME does (not do) PAs time limit per test 2.0 s memory limit per test 256 MB input standar ...
- QT进行多传感器(执行器)的编程框架
物联网的发展使得现今使用越来越广泛,对于多传感器进行管理变得十分有必要.使用传统的过程管理,很明显很容易陷入管理的混乱, 造成信息的不同步.使用面向对象的管理,以及对物理传感器在程序中进行抽象,并且建 ...
- C++编程学习(九)this指针&友元函数
mooc西工大魏英老师的课程通道关闭了,难受.现在边看工程代码边重温刷第一遍C++时候的知识点,顺序没有按照大纲的来,想到哪写到哪. this是干啥用的? 简介:在 C++ 中,每一个对象都能通过 t ...
- kafka源码系列之mysql数据增量同步到kafka
一,架构介绍 生产中由于历史原因web后端,mysql集群,kafka集群(或者其它消息队列)会存在一下三种结构. 1,数据先入mysql集群,再入kafka 数据入mysql集群是不可更改的,如何再 ...