hdoj2159

Problem : 2159 ( FATE )     Judge Status : Accepted
RunId : 2628422    Language : G++    Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
/***************************************************************\
*Author:Hu Wenbiao
*Created Time: Sun 18 Jul 2010 08:06:00 PM CST
*File Name: main.cpp
*Description:二维背包。为了求解方便,将忍耐度放在第一维,杀怪数
*放在第二维
\***************************************************************/

//*========================*Head File*========================*\\

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*----------------------*Global Variable*----------------------*/
int
n,m,k,s,a,b,bag[
100][100];//bag存放最大经验值
//*=======================*Main Program*=======================*//
using namespace std;

int
main(){

//freopen("input","r",stdin);
while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF){
memset(bag,
0,sizeof(bag));
while
(k--){
scanf(
"%d%d",&a,&b);
for
(int i=b;i<=m;++i)
//第一维忍耐度
for(int j=1;j<=s;++j)//第二维杀怪数
bag[i][j]=max(bag[i][j],bag[i-b][j-1]+a);
}

int
ans=-
1;
for
(int i=
1;ans==-1&&i<=m;++i)
for
(int j=
1;j<=s;++j)
if
(bag[i][j]>=n)
ans=i;
//当找到一个大于n的经验值时,跳出循环,由于是
//从小到大搜索的,这时的忍耐度花费最小
if(ans!=-1)
ans=m-ans;
printf(
"%d\n",ans);
}
}
posted @ 2010-07-18 20:41  open source  阅读(129)  评论(0编辑  收藏  举报