二维背包——HDU-2159

题目含义

 嗯。。。每种怪都有一个对应的经验值和忍耐度

问你能不能在有限的忍耐度和杀怪数之内得到升级所需的经验

如果能,输入升完级能保留的最大忍耐度

题目分析

如果没有杀怪数限制,就是一个将忍耐度看做背包容量,寻找忍耐度m能得到的最大经验值的完全背包

如果是给每个怪物限制一个杀怪数,那就是一个多重背包

但最后这道题两者都不是,而是一个记录杀怪数的二维背包

题目代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=107;
int n,m,k,s;
struct node{
    int val;
    int cost;
}mon[507];
int dp[maxn][maxn];
int main(){
    while(~scanf("%d%d%d%d",&n,&m,&k,&s)){
        for(int i=1;i<=k;i++)
            scanf("%d%d",&mon[i].val,&mon[i].cost);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=k;i++)
        for(int j=mon[i].cost;j<=m;j++)
        for(int t=1;t<=s;t++){
            dp[j][t]=max(dp[j][t],dp[j-mon[i].cost][t-1]+mon[i].val);
        }
        if(dp[m][s]<n)printf("-1\n");
        else{
            int mx;
            for(mx=0;mx<=m;mx++)
                if(dp[mx][s]>=n)break;
            printf("%d\n",m-mx);
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/helman/p/11232237.html