这道题目昨晚比赛没做出来,昨晚隐约觉得就是个动态规划,但是没想到怎么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 动态规划 转化背包思想的更多相关文章

  1. 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 ...

  2. Jury Compromise POJ - 1015 dp (标答有误)背包思想

    题意:从 n个人里面找到m个人  每个人有两个值  d   p     满足在abs(sum(d)-sum(p)) 最小的前提下sum(d)+sum(p)最大 思路:dp[i][j]  i个人中  和 ...

  3. Codeforces 837D 动态规划

    Codeforces 837D 动态规划 传送门:https://codeforces.com/contest/837/problem/D 题意: 给你n个数,问你从这n个数中取出k个数,这k个数的乘 ...

  4. codeforces 1183H 动态规划

    codeforces 1183H 动态规划 传送门:https://codeforces.com/contest/1183/problem/H 题意: 给你一串长度为n的字符串,你需要寻找出他的最长的 ...

  5. codeforces 212E IT Restaurants(树形dp+背包思想)

    题目链接:http://codeforces.com/problemset/problem/212/E 题目大意:给你一个无向树,现在用两种颜色去给这颗树上的节点染色.用(a,b)表示两种颜色分别染的 ...

  6. codeforces 366C Dima and Salad 【限制性01背包】

    <题目链接> 题目大意: 在一个水果篮里有n种水果,并且这些水果每一种都有一个美味度和一个卡路里的属性, 小明要从这些水果中选出来一些做一个水果沙拉, 并且要求他的水果沙拉的美味度是卡路里 ...

  7. Codeforces 946 D.Timetable-数据处理+动态规划(分组背包) 处理炸裂

    花了两个晚上来搞这道题. 第一个晚上想思路和写代码,第二个晚上调试. 然而还是菜,一直调不对,我的队友是Debug小能手呀(真的是无敌,哈哈,两个人一会就改好了) D. Timetable   tim ...

  8. Codeforces 366C Dima and Salad:背包dp

    题目链接:http://codeforces.com/problemset/problem/366/C 题意: 有n个物品,每个物品有两个属性a[i]和b[i]. 给定k,让你选出一些物品,使得 ∑ ...

  9. CodeForces - 366C Dima and Salad (01背包)

    题意:n件东西,有属性a和属性b.要选取若干件东西,使得\(\frac{\sum a_j}{\sum b_j} = k\).在这个条件下,问\(\sum a_j\)最大是多少. 分析:可以将其转化为0 ...

随机推荐

  1. String+、intern()、字符串常量池

    字符串连接符 "+"及字符串常量池实验.字符串final属性 结果预览 public class StrTest{ public static void main(String[] ...

  2. 008.CI4框架CodeIgniter, Controller控制器传输参数到View视图

    01. 在CI4中输出VIEW视图,并且传入参数,代码如下: <?php namespace App\Controllers; class Home extends BaseController ...

  3. 0105 springMVC开发基础

    背景 已经明确了MVC的思想和SpringMVC的基本流程,下面就都具体的mvc开发细节知识了. @RequestMapping springMVC核心流程中,启动阶段会把注解@RequeestMap ...

  4. android studio 入门坑

    安装 android studio,碰到下面这个图片,直接跳过. 安装时候,选择自定义设置,里面可以配置 sdk 的存放位置. 新建工程后,gradle sync 比较慢,可以 修改工程中的 buil ...

  5. poj 2456 Aggressive cows 贪心+二分

    Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25944   Accepted: 11982 ...

  6. Liunx用户运行模式

    运行模式也可以称之为运行级别(Running Level). 在linux中存在一个进程:init (initialize,初始化),进程id是1. [he@localhost ~]$ ps -ef ...

  7. usb摄像头驱动的移植

    相关软件下载地址:http://pan.baidu.com/s/16yo8Y 1.使用摄像头型号ov9650 ①修改.配置内核 1.修改vi drivers/i2c/busses/Kconfig (参 ...

  8. XV6操作系统代码阅读心得(五):文件系统

    Unix文件系统 当今的Unix文件系统(Unix File System, UFS)起源于Berkeley Fast File System.和所有的文件系统一样,Unix文件系统是以块(Block ...

  9. 086-PHP数组按数字排序和按字母排序

    <?php $arr=array(2,54,167,'a','A','12'); //定义一个数组 echo '数组排序之前的信息:<br />'; print_r($arr); / ...

  10. oracle学习笔记(4)

    4.oracle数据库的启动流程 windows操作系统 启动监听: lsnrctl start; 启动数据库实例:oradim-startup-sid 实例名 linux系统 启动监听:lsnrct ...