P1802 5倍經驗日(揹包問題)

2021-10-24 15:36:20 字數 1514 閱讀 2728

題目背景

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

題目描述

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

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

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

輸入格式

第一行兩個數,n和x

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

輸出格式

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

輸入輸出樣例

輸入

6 8

21 52 1

21 70 5

21 48 2

14 38 3

14 36 1

14 36 2

輸出

思路

這題其實就是01揹包問題改一點點就可以。

區別就在於這題每個好友你都得打。

假設你還有i瓶藥,你的某個朋友要a瓶藥才能打過。

當a <= i時

如果你不用藥直接打,那你還剩i瓶藥,經驗加失敗經驗。

如果你用藥打贏,你還剩i-a瓶藥,經驗加獲勝經驗。

當a > i時,你用藥也打不過,所以直接不用藥。加失敗經驗。

所以狀態轉移方程:

if

(j >= use[i]

) dp[j]

=max

(dp[j]

+ lose[i]

,dp[j - use[i]

]+ win[i]);

else dp[j]

+= lose[i]

;

#include

#define ll long long

using

namespace std;

int n,x;

ll lose[

1001

],win[

1001

],use[

1001];

ll dp[

1001];

intmain()

cout << dp[x]*5

;return0;

}

P1802 5倍經驗日

01揹包問題變形 將狀態轉移矩陣改為1維的時候,出現問題 錯 includeusing namespace std define ll long long const int n 1010 int win n lose n use n int f n int n,x int main cout ll...

P1802 5倍經驗日 題解

傳送門 現在樂鬥有活動了!每打乙個人可以獲得5倍經驗!absi2011卻無奈的看著那一些比他等級高的好友,想著能否把他們乾掉。乾掉能拿不少經驗的。現在absi2011拿出了x個迷你裝藥物 嗑藥打人可恥 準備開始與那些人打了 由於迷你裝乙個只能管一次,所以absi2011要謹慎的使用這些藥,悲劇的是,...

洛谷P1802 5倍經驗日

現在樂鬥有活動了!每打乙個人可以獲得5倍經驗!absi2011卻無奈的看著那一些比他等級高的好友,想著能否把他們乾掉。乾掉能拿不少經驗的。現在absi2011拿出了x個迷你裝藥物 嗑藥打人可恥 準備開始與那些人打了 由於迷你裝乙個只能管一次,所以absi2011要謹慎的使用這些藥,悲劇的是,沒到達最...