hdu 2159 FATE(二维完全背包)
/*
n 还需的经验值 最后判断
m 保留的忍耐度 2D
k 怪的种数
s 最多的杀怪数 1D
a 得到的经验值 value
b 会减掉的忍耐度 weight
*/
#include <stdio.h>
#include <string.h>
#define MAXN 105
int n, m, k, s;
int weight[MAXN], value[MAXN];
int f[MAXN][MAXN];//f[i][j] 杀怪数i,用掉忍耐度j所获得的最大经验
inline int getMax(int a, int b) { return a > b ? a : b; }
void CompletePack(int w, int v)
{
int i, j;
for(i = 1; i <= s; i++)
{
for(j = w; j <= m; j++)
{
// f[i][j] += f[i - 1][j - w];
f[i][j] = getMax(f[i][j], f[i - 1][j - w] + v);
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("indata.txt", "r", stdin);
#endif
while(scanf("%d %d %d %d", &n, &m, &k, &s) != EOF)
{
int i;
for(i = 1; i <= k; i++) scanf("%d %d", &value[i], &weight[i]);
memset(f, 0, sizeof(f));
for(i = 1; i <= k; i++) CompletePack(weight[i], value[i]);
int remain = -1;
for(i = 1; i <= s; i++)
{
for(int j = 1; j <= m; j++)
{
if(f[i][j] >= n)
{
if(remain < m - j) remain = m - j;
}
}
}
printf("%d\n", remain);
}
return 0;
}
浙公网安备 33010602011771号