题目描述
’恩 ~~这个和这个也是朋友.把他们放在一起......哇!终于完成了’mty费了好大劲,终于找出了一支最为庞大的军队.
fyc很高兴,立马出征与人fight.mty万万没想到fyc竟然把他也叫去了.偶像的命令不可违抗,mty只好跟着出发了.
两军交战采用一对一单挑的形式.mty一上来就遇到了一个对手.此人身高2米12,头大,腿粗.....这个人fight崇尚防守反击,他要等mty出手,漏出破绽才进攻,且只进攻一次.现在mty有p个招数,每招都会给对方造成伤害,也会让对手有可趁之机来攻击自己,造成伤害.
mty进攻一次需1秒,而他的对手出招很快,进攻时间可以忽略不计.
mty想在最短时间内战胜对方,请你帮帮忙.
第一行,三个数,n,m,p(对方有n点HP,mty有m点,mty有p个招数); n<=100,m<=100,p<=1000;
接下来p行,每行两个数,x[i],y[i](表示这招会给对方造成x[i]点伤害,对手会给mty造成y[i]点伤害);
只有当对方HP为0,不包括负数,mtyHP为正数时,mty才算赢
一个数表示mty要战胜对手所需最少秒数.如果,mty不可能赢,就输出’mty zhen mei yong!’(不包括引号)
样例输入
2 1 1
2 0
样例输出
1
dp[i][j]代表敌人Hp为i,myt Hp为j时所用秒数。。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<string.h> 5 #include<math.h> 6 #include<map> 7 #define inf 10000000 8 using namespace std; 9 10 int main() 11 { 12 int n,m,p; 13 int x[1120]; 14 int y[1220]; 15 scanf("%d%d%d",&n,&m,&p); 16 for(int i=1; i<=p; i++) 17 { 18 scanf("%d%d",&x[i],&y[i]); 19 } 20 int dp[122][122]; 21 for(int i=0; i<=n; i++) 22 { 23 for(int j=0; j<=m; j++) 24 { 25 dp[i][j]=inf; 26 } 27 } 28 dp[0][0]=0; 29 for(int i=1; i<=p; i++) 30 { 31 for(int j=x[i]; j<=n; j++) 32 { 33 for(int k=y[i]; k<=m; k++) 34 { 35 dp[j][k]=min(dp[j-x[i]][k-y[i]]+1,dp[j][k]); 36 } 37 } 38 } 39 int ans=inf; 40 for(int i=1; i<m; i++) 41 { 42 if(dp[n][i]<ans) ans=dp[n][i]; 43 } 44 if(ans==inf) 45 printf("mty zhen mei yong!\n"); 46 else printf("%d\n",ans); 47 return 0; 48 }