您的位置:首页 > 其它

hdu 2159(二维完全背包)

2013-03-11 21:06 323 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159

思路:dp[j][l]表示消耗了j忍耐度,杀了l个怪后获得的经验值;最后只要对dp扫一遍,找出是否有大于等于n的值,如果有,这保留此时的消耗的忍耐值;否则,输出-1;

View Code

#include<iostream>
const int N=110;
using namespace std;
struct Node{
int value,cost;
}node
;
int dp

;

int main(){
int n,m,k,s;
while(~scanf("%d%d%d%d",&n,&m,&k,&s)){
for(int i=0;i<k;i++){
scanf("%d%d",&node[i].value,&node[i].cost);
}
memset(dp,0,sizeof(dp));
for(int i=0;i<k;i++){
for(int j=node[i].cost;j<=m;j++){
//限定杀怪的个数
for(int l=1;l<=s;l++){
dp[j][l]=max(dp[j][l],dp[j-node[i].cost][l-1]+node[i].value);
}
}
}
int flag=false,k;
for(int j=0;j<=m;j++){
if(flag)break;
for(int l=1;l<=s;l++){
if(dp[j][l]>=n){
flag=true;
k=j;
break;
}
}
}
if(flag){
printf("%d\n",m-k);
}else
printf("%d\n",-1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: