二维背包——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; }