HDu 2159 FATE(フルバックパック)
2235 ワード
FATE
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10490 Accepted Submission(s): 4972
Problem Description
最近xhdはFATEというゲームをしていて、極品の装備を得るために、xhdは絶えず怪を殺して任務をしています.やがてxhdは殺しに嫌悪感を抱き始めたが、殺しによって最後のレベルを上げざるを得なかった.現在の問題は、xhdが最後のレベルに上昇するにはnの経験値が必要であり、xhdはmの忍耐度を残しており、怪xhdを殺すたびに相応の経験を得て、相応の忍耐度を減らすことである.忍耐度が0以下に下がると、xhdはこのゲームをしません.xhdは彼がせいぜいsだけを殺すと言った.すみません、彼はこの最後のレベルに上がることができますか?
Input
入力データには複数のグループがあり、各グループのデータの最初の行に対してn,m,k,s(0
Output
出力がこのレベルに上昇しても残る最大忍耐度は、このレベルの出力-1を上昇できない場合です.
Sample Input
Sample Output
考え方:
dp{j][ p]を記録し、jは忍耐度、pは殺怪の数を表す
転移方程式:dp[j][p]=max(dp[j-d[i]][p-1]+v[i],dp[j][p]);
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10490 Accepted Submission(s): 4972
Problem Description
最近xhdはFATEというゲームをしていて、極品の装備を得るために、xhdは絶えず怪を殺して任務をしています.やがてxhdは殺しに嫌悪感を抱き始めたが、殺しによって最後のレベルを上げざるを得なかった.現在の問題は、xhdが最後のレベルに上昇するにはnの経験値が必要であり、xhdはmの忍耐度を残しており、怪xhdを殺すたびに相応の経験を得て、相応の忍耐度を減らすことである.忍耐度が0以下に下がると、xhdはこのゲームをしません.xhdは彼がせいぜいsだけを殺すと言った.すみません、彼はこの最後のレベルに上がることができますか?
Input
入力データには複数のグループがあり、各グループのデータの最初の行に対してn,m,k,s(0
Output
出力がこのレベルに上昇しても残る最大忍耐度は、このレベルの出力-1を上昇できない場合です.
Sample Input
10 10 1 10
1 1
10 10 1 9
1 1
9 10 2 10
1 1
2 2
Sample Output
0
-1
1
考え方:
dp{j][ p]を記録し、jは忍耐度、pは殺怪の数を表す
転移方程式:dp[j][p]=max(dp[j-d[i]][p-1]+v[i],dp[j][p]);
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
int dp[105][105];
int v[105], d[105];
int main()
{
int n, m, k, s, i, j, p;
while(~scanf("%d%d%d%d", &n, &m, & k, &s))
{
for( i = 1; i <= k; i ++)
{
scanf("%d%d", &v[i], &d[i]);
}
memset(dp, 0, sizeof(dp));
for(i = 1; i <= k; i ++)
{
for(j = d[i]; j <= m; j ++)//
{
for(p = 1; p <= s; p ++)//
{
dp[j][p] = max(dp[j - d[i]][p - 1] + v[i], dp[j][p]);
}
}
}
int ans = 0;
//
for(i = 1; i <= m ;i ++)
{
if(ans)
break;
for(j = 1; j <= s; j ++)
{
if(dp[i][j] >= n)
{
ans = i;
break;
}
}
//printf("
");
}
if(ans == 0)
printf("-1
");
else
printf("%d
", m - ans);
}
}