Dima and Salad

题目链接:nowcoder 110246

到牛客看:

——>点我跳转<——

题目大意

有一些东西,对于某个东西只能选或不选。每个东西有价值和消耗。

然后要你在保证总价值除以总消耗的值为给定的 k 的情况下,总价值尽可能高。
如果无法弄出,则输出 -1,否则输出最大总价值。

思路

这道题很明显就是 01 背包。

那我们先想想暴力的 01 背包是怎么弄的。
那就是开三维,fi,j,kf_{i,j,k}fi,j,k​ 表示到第 iii 个东西,总价值是 jjj,消耗是 kkk,这样的状态是否存在。

那你这样空间滚动之后是可以,但是会 TLE。

那你考虑把性质相同的可以弄在一起的状态弄在一起,因为它只是要两个相除是一个数,总有一些状态是相同的。
那我们考虑怎么找。

就从公式找起。

ai,bia_i,b_iai​,bi​ 分别表示你你选的物品的价值和消耗组成的数组。

那因为下面如果要一个一个来弄是不可以每次除,那我们移项,是它可以分步处理。
可以化出这个式子:
∑j=1maj−k×∑j=1mbj=0\sum\limits_{j=1}^{m}a_j-k\times \sum\limits_{j=1}^{m}b_j=0j=1∑m​aj​−k×j=1∑m​bj​=0
那很明显 ∑j=1m\sum\limits_{j=1}^{m}j=1∑m​ 可以放到最外面。
∑j=1m(aj−k×bj)=0\sum\limits_{j=1}^{m}(a_j-k\times b_j)=0j=1∑m​(aj​−k×bj​)=0

那我们就可以把后面的两维弄成一维,用 ai−k×bja_i-k\times b_jai​−k×bj​ 表示状态。

那原来只是表示这个状态是否存在,那现在我们改成这样,就要看一下题目的要求。题目要总价值尽可能大,那我们就表示的是这个状态能有的最大价值。

然后很明显,状态会有负数,那我们就给它第二维的状态都加一个值使得全都是非负数,就解决了这个问题。

可以用滚动数组来优化空间,但是不优化也可以过,我就懒得优化。

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#define di 20000//因为状态有负数,所以要统一移一下using namespace std;int n, k, a[101], b[101];
int c[101], f[101][40001];int main() {scanf("%d %d", &n, &k);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);for (int i = 1; i <= n; i++) scanf("%d", &b[i]);for (int i = 1; i <= n; i++)//算出对应的状态值c[i] = a[i] - b[i] * k;memset(f, -1, sizeof(f));f[0][di] = 0;for (int i = 1; i <= n; i++)for (int j = 40000; j >= 0; j--)if (f[i - 1][j] != -1) {//买if (j + c[i] <= 40000 && j + c[i] >= 0)f[i][j + c[i]] = max(f[i][j + c[i]], f[i - 1][j] + a[i]);//不买f[i][j] = max(f[i][j], f[i - 1][j]);}//记得这里第二维不是看 0,而是看移动之后的 “0” 对应的位置if (f[n][di]) printf("%d", f[n][di]);else printf("-1");return 0;
}

【nowcoder 110246】Dima and Salad相关推荐

  1. 【nowcoder 224882】牛牛和数组操作(贪心)(剪枝)(区间DP)

    牛牛和数组操作 题目链接:nowcoder 224882 题目大意 给你一个没有 0 的数组,每次你可以选一个数,然后把它变成 0,费用是它两边为端点最长的没有 0 的最长区间的最大值. 然后要你在最 ...

  2. 【nowcoder 219641】天使果冻

    天使果冻 题目链接:nowcoder 219641 到牛客看: -->点我跳转<-- 题目大意 要你求前 1~n 个数字中,第二大的数字. 如果有多个最大,第二大就是最大. 思路 这是个多 ...

  3. 【nowcoder 219035】春游

    春游 题目链接:nowcoder 219035 到牛客看: -->点我跳转<-- 题目大意 有 n 个人,然后有 a 元的 2 人船,有 b 元的三人船,船不一定要坐满. 问你让所有人都有 ...

  4. 【nowcoder 219034】五连珠

    五连珠 题目链接:nowcoder 219034 到牛客看: -->点我跳转<-- 题目大意 有两个里面放着着 1~25 各一个的 5*5 矩阵. 然后给你一个 1~25 的排列,你按顺序 ...

  5. 【nowcoder 217602】照看小猫

    照看小猫 题目链接:nowcoder 217602 到牛客看: -->点我跳转<-- 题目大意 要你给一些猫起名字,每一只猫的名字不能相同,而且每只猫有要求,要求它的名字长度不能超过它给定 ...

  6. 【nowcoder 217127】炼金术师

    炼金术师 题目链接:nowcoder 217127 到牛客看: -->点我跳转<-- 题目大意 给你一些操作,每次将 1~x 的地方染上一个新的颜色. 你可以任意选一个颜色,选一个 x 把 ...

  7. 【nowcoder 225278】牛牛嚯可乐(dfs)

    牛牛嚯可乐 题目链接:nowcoder 225278 到牛客看: -->点我跳转<-- 题目大意 给你一个 8 个长度的字符串,你每次操作可以交换一对字符的位置. 然后问你最少要多少次操作 ...

  8. 【NOWCODER】- Python:字典(一)

    [NOWCODER]- Python 刷题

  9. 【NOWCODER】- Python:列表(二)

    [NOWCODER]- Python 刷题

  10. 【NOWCODER】- Python:条件语句

    [NOWCODER]- Python 刷题

最新文章

  1. Java论坛系统 JForum
  2. 初识Mysql(一)
  3. Speerio Skinergy 'Image' is ambiguous 错误
  4. 商汤科技回应“IPO推迟”:“被”IPO,还“被”推迟了
  5. PHP 基础知识测试题
  6. ECS入门之Hello World
  7. 蓝桥杯 基础练习 2n皇后问题(从n皇后问题入手)
  8. ansible概念以及基础(一)
  9. es6标准入门第3版pdf_最详细,快速入门Web前端开发的正确姿势
  10. Windows Phone开发(40):漫谈关键帧动画之中篇 转:http://blog.csdn.net/tcjiaan/article/details/7559978...
  11. 人工智能技术发展综述
  12. 戴尔电脑vostro恢复出厂(预装Win10)的设置方法
  13. android常用快捷键大全,AndroidStudio 快捷键使用总结大全
  14. 综合日语第一册第八课
  15. java如何处理锯齿_java – 平滑锯齿的路径
  16. Google advertiser 开发
  17. 中国高校与研究院所计算机学科分专业点评(本贴内容仅供参考!)
  18. linux终端jar命令无法使用
  19. (小白)python如何微信自动加好友
  20. springboot+jsp学生综合素质测评系统

热门文章

  1. 多视图聚类方向:子空间学习
  2. shuipfcms二次开发之图片上传
  3. chrome extensions 中的交互
  4. 物联网大赛 - Android学习笔记(三)Android 事件处理
  5. C语言逻辑门运算示例
  6. 调整和删除Win7休眠文件Hiberfil.sys释放C盘
  7. IMDB排名前250名的电影,你看过几部?
  8. Python中的逻辑运算符:‘and‘与‘or‘的用法
  9. 【Segmentation】
  10. 3. 从0开始学ARM-ARM模式、寄存器、流水线