简单的dp,但是我还是参考了网上的思路,具体我没考虑到的地方见代码
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define inf 2100000000
//int min(int a,int b)
//{
// return a<b? a:b;
//}
int main()
{
int t,i,j,n,m;
int t1,t2,t3,f1,f2;
int dp[][];
int ans; scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=;i<=;i++)
{
for(j=;j<=;j++)
{
dp[i][j]=inf;
}
}
dp[][m]=; for(i=;i<=n;i++)
{
scanf("%d%d%d%d%d",&t1,&t2,&t3,&f1,&f2);
for(j=;j<=m;j++)
{
if(j-f1>=)
dp[i][j-f1]=min(dp[i][j-f1],dp[i-][j]+t1);
dp[i][j]=min(dp[i][j],dp[i-][j]+t2); //原来是这个处理有问题,因为最大能量不能大于m,所以凡是能量大于m的,都算在等于m里面
//if(j+f2<=m)
// dp[i][j+f2]=min(dp[i][j+f2],dp[i-1][j]+t3);
int temp=(j+f2)>m? m:(j+f2);
dp[i][temp]=min(dp[i][temp],dp[i-][j]+t3); }
}
ans=inf;
for(i=;i<=m;i++)
{
ans=ans<dp[n][i]? ans:dp[n][i];
} printf("%d\n",ans);
}
return ;
}
//dp[i][j],到达i点剩余体力为j的最快时间
ps:dp,我要攻下你!