洛谷_P1802 5倍经验日 (尚贤)

【题目】:https://www.luogu.com.cn/problem/P1802

一道裸的01背包,特别简单。不过只是需要注意不用药打的人也要算在重量内

题目分析

简单的01背包,不过实在01背包的基础上加了一个小小的变化,也就是不用药打也是要算在重量内。
所以可得动态转移方程:

f[j]=max(f[j]+lost[i],f[j-use[i]]+win[i]) (当j>=use[i]时)

f[j]=f[j]+lost[i] (当j<use[i]时)

代码如下:

//--新阶梯工作室防伪水印--
//--By新阶梯工作室 闪现--
#include <ctime>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>//头文件准备
#define in freopen (".in","r",stdin)
#define out freopen (".out","w",stdout)
#define INF 2147483647
#define UNINF -2147483648ll
#define ch char
#define bo bool
#define ui unsigned int
#define ll long long//闪现为了少打几个字符,弄了好多好多宏定义
using namespace std;
int n,v,c[1005];
ll f[1005],w1[1005],w2[1005];//要用long long类型数组,要不然会爆
inline void work();
int main(){
    //in;out;
    work();
    return 0;
}
inline void work(){
    scanf ("%d %d",&n,&v);
    for (int i=1;i<=n;i++){
        scanf ("%lld %lld %d",&w1[i],&w2[i],&c[i]);
        w1[i]*=5;
        w2[i]*=5;//一开始就把5乘了,要不然容易忘记
    }
    for (int i=1;i<=n;i++){
        for (int j=v;j>=c[i];j--){//注意:01背包是从v到c[i],不是从c[i]到v
            f[j]=max(f[j]+w1[i],f[j-c[i]]+w2[i]);//动态转移方程一
        }
        for (int j=c[i]-1;j>=0;j--){
            f[j]+=w1[i];//动态转移方程二
        } 
    }
    printf ("%lld\n",f[v]);//最后一定要用%lld输出
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值