简单的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[310][310]; int ans; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<=300;i++) { for(j=0;j<=300;j++) { dp[i][j]=inf; } } dp[0][m]=0; for(i=1;i<=n;i++) { scanf("%d%d%d%d%d",&t1,&t2,&t3,&f1,&f2); for(j=0;j<=m;j++) { if(j-f1>=0) dp[i][j-f1]=min(dp[i][j-f1],dp[i-1][j]+t1); dp[i][j]=min(dp[i][j],dp[i-1][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-1][j]+t3); } } ans=inf; for(i=0;i<=m;i++) { ans=ans<dp[n][i]? ans:dp[n][i]; } printf("%d ",ans); } return 0; } //dp[i][j],到达i点剩余体力为j的最快时间
ps:dp,我要攻下你!