1. 程式人生 > 實用技巧 >P1802 5倍經驗日(揹包)

P1802 5倍經驗日(揹包)

題目背景

現在樂鬥有活動了!每打一個人可以獲得5倍經驗!absi2011卻無奈的看著那一些比他等級高的好友,想著能否把他們幹掉。幹掉能拿不少經驗的。

題目描述

現在absi2011拿出了x個迷你裝藥物(嗑藥打人可恥….),準備開始與那些人打了

由於迷你裝一個只能管一次,所以absi2011要謹慎的使用這些藥,悲劇的是,沒到達最少打敗該人所用的屬性藥了他打人必輸>.<所以他用2個藥去打別人,別人卻表明3個藥才能打過,那麼相當於你輸了並且這兩個屬性藥浪費了。

現在有n個好友,有輸掉拿的經驗、贏了拿的經驗、要嗑幾個藥才能打過。求出最大經驗(注意,最後要乘以5)

輸入格式

第一行兩個數,n和x

後面n行每行三個數,分別表示輸了拿到的經驗(lose[i])、贏了拿到的經驗(win[i])、打過要至少使用的藥數量(use[i])。

輸出格式

一個整數,最多獲得的經驗

#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
typedef long long ll;
ll dp[maxn];
struct node {
    ll c;
    ll w;
    ll w1;
}Node[maxn*2];
int vis[maxn];
int main() {
    int n,x;
    scanf(
"%d%d",&n,&x); for (int i=1;i<=n;i++) { ll x1,x2,c; scanf("%lld%lld%lld",&x1,&x2,&c); Node[i]={c,x2,x1}; } for (int i=1;i<=n;i++) { for (int j=x;j>=0;j--) { if (j>=Node[i].c)dp[j]=max(dp[j],max(dp[j-Node[i].c]+Node[i].w,dp[j]+Node[i].w1));
else dp[j]=max(dp[j],dp[j]+Node[i].w1); } } ll ans=0; for (int i=0;i<=x;i++) ans=max(ans,dp[i]); printf("%lld\n",ans*5); }