【nowcoder 110246】Dima and Salad
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∑maj−k×j=1∑mbj=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相关推荐
- 【nowcoder 224882】牛牛和数组操作(贪心)(剪枝)(区间DP)
牛牛和数组操作 题目链接:nowcoder 224882 题目大意 给你一个没有 0 的数组,每次你可以选一个数,然后把它变成 0,费用是它两边为端点最长的没有 0 的最长区间的最大值. 然后要你在最 ...
- 【nowcoder 219641】天使果冻
天使果冻 题目链接:nowcoder 219641 到牛客看: -->点我跳转<-- 题目大意 要你求前 1~n 个数字中,第二大的数字. 如果有多个最大,第二大就是最大. 思路 这是个多 ...
- 【nowcoder 219035】春游
春游 题目链接:nowcoder 219035 到牛客看: -->点我跳转<-- 题目大意 有 n 个人,然后有 a 元的 2 人船,有 b 元的三人船,船不一定要坐满. 问你让所有人都有 ...
- 【nowcoder 219034】五连珠
五连珠 题目链接:nowcoder 219034 到牛客看: -->点我跳转<-- 题目大意 有两个里面放着着 1~25 各一个的 5*5 矩阵. 然后给你一个 1~25 的排列,你按顺序 ...
- 【nowcoder 217602】照看小猫
照看小猫 题目链接:nowcoder 217602 到牛客看: -->点我跳转<-- 题目大意 要你给一些猫起名字,每一只猫的名字不能相同,而且每只猫有要求,要求它的名字长度不能超过它给定 ...
- 【nowcoder 217127】炼金术师
炼金术师 题目链接:nowcoder 217127 到牛客看: -->点我跳转<-- 题目大意 给你一些操作,每次将 1~x 的地方染上一个新的颜色. 你可以任意选一个颜色,选一个 x 把 ...
- 【nowcoder 225278】牛牛嚯可乐(dfs)
牛牛嚯可乐 题目链接:nowcoder 225278 到牛客看: -->点我跳转<-- 题目大意 给你一个 8 个长度的字符串,你每次操作可以交换一对字符的位置. 然后问你最少要多少次操作 ...
- 【NOWCODER】- Python:字典(一)
[NOWCODER]- Python 刷题
- 【NOWCODER】- Python:列表(二)
[NOWCODER]- Python 刷题
- 【NOWCODER】- Python:条件语句
[NOWCODER]- Python 刷题
最新文章
- Java论坛系统 JForum
- 初识Mysql(一)
- Speerio Skinergy 'Image' is ambiguous 错误
- 商汤科技回应“IPO推迟”:“被”IPO,还“被”推迟了
- PHP 基础知识测试题
- ECS入门之Hello World
- 蓝桥杯 基础练习 2n皇后问题(从n皇后问题入手)
- ansible概念以及基础(一)
- es6标准入门第3版pdf_最详细,快速入门Web前端开发的正确姿势
- Windows Phone开发(40):漫谈关键帧动画之中篇 转:http://blog.csdn.net/tcjiaan/article/details/7559978...
- 人工智能技术发展综述
- 戴尔电脑vostro恢复出厂(预装Win10)的设置方法
- android常用快捷键大全,AndroidStudio 快捷键使用总结大全
- 综合日语第一册第八课
- java如何处理锯齿_java – 平滑锯齿的路径
- Google advertiser 开发
- 中国高校与研究院所计算机学科分专业点评(本贴内容仅供参考!)
- linux终端jar命令无法使用
- (小白)python如何微信自动加好友
- springboot+jsp学生综合素质测评系统