题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3008
分析:用dp[i][j]表示攻击了i次对其造成j点伤害自身剩余魔值,则有
dp[i][j+b[k]] = max( dp[i][j+b[k]], dp[i-1][j]-a[i] );
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iomanip>
using namespace std;
int dp[105][105];///dp[i][j]表示攻击了i次,打了对方j点生命,自己剩下的魔值
int a[105]= {0};
int b[105]= {1};
int main() {
int n,t,k;
while(cin>>n>>t>>k,n+t+k) {
int m=100/k+(100%k?1:0);
for(int i=1; i<=n; ++i)
cin>>a[i]>>b[i];
memset(dp,-1,sizeof(dp));
dp[0][0]=100;///开始时魔法值为100
for(int i=1;i<=m;++i)
for(int j=0;j<=100;++j)
if(dp[i-1][j]!=-1){
dp[i-1][j] = (dp[i-1][j]+t)>100 ? 100:dp[i-1][j]+t;///魔值不超过100
for(int k=0;k<=n;++k)
if(dp[i-1][j]>=a[k]&&dp[i-1][j]-a[k]>dp[i][j+b[k]])
if(j+b[k]>=100)
dp[i][100]=dp[i-1][j]-a[k];
else
dp[i][j+b[k]]=dp[i-1][j]-a[k];
}
int p=1;
for( ;p<=m;++p)
if(dp[p][100]!=-1){
cout<<p<<endl; break;
}
if(p>m)puts("My god");
}
return 0;
}