P1802 5倍經驗日(揹包)
阿新 • • 發佈:2020-08-07
題目背景
現在樂鬥有活動了!每打一個人可以獲得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); }