第十一届山东省大学生程序设计竞赛 Adventurer‘s Guild(dp)

传送门

题意

给出怪物的数量n,人物血量H,人物的攻击S;
接下来n行,每一行为每只怪物的血量h,攻击s,价值w;

每消灭一个怪物,消耗h的血量和s的攻击,S如果为负数,需要用H去弥补S,如果H为负数则结束;
输出可以获得的最大价值;

思路

背包问题的小变种,dp[i][j]消耗的血量为i,攻击为j所能获得的最大价值;

Code:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define hz020 return
#define mes memset
#define mec memcpy

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int>pii;

const int N = 1010;
const int null = 0x3f3f3f3f;
const ll mod = 1000000007;

int n,H,S; 
ll dp[N][N];

int main()
{
     
	cin >> n >> H >> S;
	ll ans = 0;
	for(int i = 1;i <= n;i ++)
	{
     
		int h,s,w;
		cin >> h >> s >> w;
		for(int j = H;j > h;j --)
		{
     
			for(int k = S;k >= 0;k --)
			{
     
				if(j + k > h + s && j > h)
				{
     
					if(s > k)//攻击不够,血量补
					{
     
						int x = h + s - k;
						dp[j][k] = max(dp[j][k],dp[j - x][0] + w);
						ans = max(ans, dp[j][k]);
					}
					else//攻击够
					{
     
						dp[j][k] = max(dp[j][k],dp[j - h][k - s] + w);
						ans = max(dp[j][k],ans);
					}
				}
			}
		}
	}
	
	cout << ans << endl;
	
	hz020 0;
}  

你可能感兴趣的:(动态规划)