【動態規劃】01揹包問題-練習題-5倍經驗值

原題網址

題目描述

現在樂鬥有活動了!每打一個人可以獲得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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章