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