codeforces-214(Div. 2)-C. Dima and Salad+DP恰好背包花费
2024-10-02 21:47:48
codeforces-214(Div. 2)-C. Dima and Salad
题意:有不同的沙拉,对应不同的颜值和卡路里,现在要求取出总颜值尽可能高的沙拉,同时要满足
解法:首先要把除法变成乘法,就是每次把读进来的b[ i ] 乘以 K;
因为对于a [ i ] - b[ i ] * k有两种不同的可能(大于0和小于0),可以放在一个以25000为中心的,大小为50000的dp数组里;
比如对于样例1:
input
3 2
10 8 1
2 7 1
output
18
这里我们缩小一下数据
我一开始不理解,为什么dp[j - b[i]]为什么只能在非-1的情况下更新dp[j];后来画了图就明白了;
下面ac代码:
//learnt and created at 2018/2/7
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int n,k;
int a[],b[];
int dp[],mid = ;
int main(){
scanf("%d%d",&n,&k);
for(int i=; i<=n; i++)
{
scanf("%d",&a[i]);
}
for(int i=; i<=n; i++)
{
scanf("%d",&b[i]);
b[i] = a[i] - b[i]*k;
}
memset(dp,-,sizeof(dp)); //把dp数组初始化为-1;只把dp[25000]=0;
dp[mid]=;
for(int i=; i<=n; i++)
{
if(b[i]>=)
{
for(int j=; j>=b[i]; j--)
{
if(dp[j-b[i]] !=-)
dp[j] = max(dp[j-b[i]]+a[i],dp[j]);
}
}
else
{
for(int j=; j<=+b[i]; j++)
{
if(dp[j-b[i]]!=-)
dp[j] =max(dp[j-b[i]]+a[i],dp[j]);
}
}
}
if(dp[mid]==)puts("-1");
else printf("%d\n",dp[mid]); return ;
}
最新文章
- hadoop生态圈介绍
- [linux] Nginx编译安装错误error: the HTTP rewrite module requires the PCRE library
- 极客DIY:使用树莓派制作一套“NAS+私有云盘+下载机”
- org-mode
- netdata linux环境下的安装
- 【codevs】2776寻找代表元
- UIPinchGestureRecognizer 的scale使用
- html5权威指南:设置文本样式
- [Codeforces]860E Arkady and a Nobody-men
- eclipse遇到的问题
- Java并发编程(一)-- 多线程的基本概念
- PHP continue break 区别 用法
- python2与python3的区别(持续更新)
- Axure 验证码、进度条、分页条(翻页)、搜索框、选项卡
- React Native超棒的LayoutAnimation(布局动画)
- javascript中json对象长度
- sql盲注之报错注入(附自动化脚本)
- easyui panel异步获取后台数据在前台显示
- io流之节点流inputstream、outputstream、reader、writer
- visible, disable, css绑定