背包问题
只要注意每次蓝是在增加的就行。。。。。。
有个地方有疑问 :每次从之前得到之后的状态的时候应该之前的蓝应该要满足要求的 (代码注释地方)但是没有注释的后面那个判断也能过。。。。
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef struct{
int cost, hurt;
}Node;
int main(){
int dp[101][1000];
int n, t, q;
Node skill[101];
skill[0].cost = 0;
skill[0].hurt = 1;
bool flag;
int ans;
while( scanf( "%d%d%d", &n, &t, &q ) && !( n == 0 && t == 0 && q == 0 ) ){
memset( dp, 0, sizeof( dp ) );
for( int i = 1; i <= n; i++ ){
scanf( "%d%d", &skill[i].cost, &skill[i].hurt );
}
flag = false;
for( int i = 1; ( i - 1 ) * q < 100 && !flag; i++ ){
for( int j = 100 + ( i - 1 ) * t; j >= 0 && !flag; j-- ){
for( int k = 0; k <= n && !flag; k++ ){
if( ( j - skill[k].cost >= 0 ) && ( ( i > 1 ) ? ( j - skill[k].cost <= 100 + ( i - 2 ) * t ) : true ) ){// 这里不加后面的判断也能过 我感觉应该不能过的 不知道为嘛。。。。
dp[i][j] = max( dp[i][j], dp[i-1][j-skill[k].cost] + skill[k].hurt );
if( dp[i][j] >= 100 ){
flag = true;
ans = i;
}
}
}
}
}
if( flag ){
cout << ans << endl;
}else{
cout << "My god" << endl;
}
}
return 0;
}