注意:怪兽的身体值只能与自己的身体值相碰,耐力值就相当于三级甲,自己的身体值大于怪兽的身体值时才能打掉他。
三维的,就内存超限,过不了,优化一下成二维的
#include <iostream>
using namespace std;
struct node{
int h;
int s;
int w;
}v[1005];
long long f[1005][305][305];
int main(int argc, char** argv) {
int n,H,S;
scanf("%d%d%d",&n,&H,&S);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&v[i].h,&v[i].s,&v[i].w);
}
for(int i=1;i<=n;i++){
for(int j=H;j>=1;j--){
for(int k=S;k>=0;k--){
f[i][j][k]=f[i-1][j][k];
if(j+k>v[i].h+v[i].s){
if(j>v[i].h){
if(k>v[i].s){
f[i][j][k]=max(f[i][j][k],f[i][j-v[i].h][k-v[i].s]+v[i].w);
}
else{
f[i][j][k]=max(f[i][j][k],f[i][j+k-v[i].s-v[i].h][0]+v[i].w);
}
}
}
}
}
}
printf("%lld",f[n][H][S]);
return 0;
}
二维的:可以过,
#include <iostream>
using namespace std;
struct node{
int h;
int s;
int w;
}v[1005];
long long f[305][305];
int main(int argc, char** argv) {
int n,H,S;
scanf("%d%d%d",&n,&H,&S);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&v[i].h,&v[i].s,&v[i].w);
}
for(int i=1;i<=n;i++){
for(int j=H;j>=1;j--){
for(int k=S;k>=0;k--){
if(j+k>v[i].h+v[i].s){
if(j>v[i].h){
if(k>v[i].s){
f[j][k]=max(f[j][k],f[j-v[i].h][k-v[i].s]+v[i].w);
}
else{
f[j][k]=max(f[j][k],f[j+k-v[i].s-v[i].h][0]+v[i].w);
}
}
}
}
}
}
printf("%lld",f[H][S]);
return 0;
}