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;
}

posted @ 2010-10-20 00:05  菜到不得鸟  阅读(133)  评论(0)    收藏  举报