这道题目昨晚比赛没做出来,昨晚隐约觉得就是个动态规划,但是没想到怎么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. 001.Delphi插件之QPlugins,一个最简单的插件

    安装QPlugins里面的Demo,复制粘贴着写了一个最简单的插件,看看好不好用 EXE代码如下: unit Main_Frm; interface uses Winapi.Windows, Wina ...

  2. apk安装失败的25中原因

    名称 Value 描述 INSTALL_FAILED_ALREADY_EXISTS -1 已经安装 INSTALL_FAILED_INVALID_APK -2 APK文件是无效的 INSTALL_FA ...

  3. Delphi IDFtp用法,包含断点续传

    1  连接远程服务器procedure Connect(AAutoLogin: boolean; const ATimeout: Integer);2  改变目录procedure ChangeDir ...

  4. 微信小程序学习开发笔记

    首先注册小程序开账号,下载开发工具之后,先啃官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/ ,把小程序的基本的代码框架 ...

  5. Codeforces Round #618 (Div. 2) 小号上紫之路

    这一场涨了不少,题也比较偏思维,正好适合我 A. Non-zero 我们记录这些数字的总和sum,并且记录0的个数zero,显然答案应该是这些0的个数,注意如果sum+zero==0的话答案要额外加一 ...

  6. Jenkins实现自动打包,MAVEN打包,Shell脚本启动

    1.点击New任务 2.创建任务,输入项目名 3.输入描述等 4.选择Git或SVN 5.自动,定时打包 6.在Build下配置

  7. 使用Kickstart+pxe自动化安装部署无人值守的linux服务器

    Kickstart+pxe Kickstart无人职守安装RHEL5过程分享(详细图解版) 启动应用有:httpd.dhcpd.named.xinetd 无人职守自动批量安装linux系统超详细 参考 ...

  8. 六十五、SAP中通过BREAK-POINT下断点,进行调试

    一.代码如下,有2个断点的按钮,可以可以写入BREAK-POINT人工断点 二.运行之后,程序会被断下来, 四个执行按钮,意思分别为:单步进入子程序,单步不进入子程序,返回外面,执行到断点处 三.我们 ...

  9. Swift Json解析与model互转

    Json的解码与编码操作,这里使用swift自带的类JSONDecoder 和 JSONEncoder 1.基础处理 如果你的 JSON 数据结构和你使用的 Model 对象结构一致的话,那么解析过程 ...

  10. SQL Server 语法大全

    SQL语句参考,包含Access.MySQL 以及 SQL Server 基础 创建数据库 CREATE DATABASE database-name 删除数据库 drop database dbna ...