題目描述
現在樂鬥有活動了!每打一個人可以獲得5倍經驗!absi2011卻無奈的看着那一些比他等級高的好友,想着能否把他們幹掉。幹掉能拿不少經驗的。
現在absi2011拿出了x個迷你裝藥物(嗑藥打人可恥….),準備開始與那些人打了
由於迷你裝一個只能管一次,所以absi2011要謹慎的使用這些藥,悲劇的是,沒到達最少打敗該人所用的屬性藥了他打人必輸>.<所以他用2個藥去打別人,別人卻表明3個藥才能打過,那麼相當於你輸了並且這兩個屬性藥浪費了。
現在有n個好友,有輸掉拿的經驗、贏了拿的經驗、要嗑幾個藥才能打過。求出最大經驗(注意,最後要乘以5)
輸入格式
第一行兩個數,n和x
後面n行每行三個數,分別表示輸了拿到的經驗(lose[i])、贏了拿到的經驗(win[i])、打過要至少使用的藥數量(use[i])。
輸出格式
一個整數,最多獲得的經驗
輸入輸出樣例
輸入 #1
6 8
21 52 1
21 70 5
21 48 2
14 38 3
14 36 1
14 36 2
輸出:1060
解題
這是一道典型的揹包問題,不一樣的是這裏無論是輸還是贏都會的得到相應的經驗值,可以就之前的揹包問題代碼稍作改動即可(不瞭解揹包問題的可以看看我的這篇筆記)
代碼如下:
#include<iostream>
#include<algorithm>
using namespace std;
//01揹包問題。
int lose[1001],win[1001],n,x,use[1001];
long long f[1001][1001];
int main(){
cin>>n>>x;
for(int i=1;i<=n;i++)
cin>>lose[i]>>win[i]>>use[i];
//f[][]的類型是long long,不然也會錯
for(int i=1;i<=n;i++)
for(int j=0;j<=x;j++)
{
//j=0開始循環,因爲有可能x=0,即本身沒有藥,也有可能打一些玩家也不用藥
if(j>=use[i])
f[i][j]=max(f[i-1][j-use[i]]+win[i],f[i-1][j]+lose[i]);
else f[i][j]=f[i-1][j]+lose[i];
}
cout<<f[n][x]*5;
//最後的經驗值別忘了乘以5 哦
return 0;
}