Problem : 1114 ( Piggy-Bank ) Judge Status : Accepted
RunId : 2598486 Language : G++ Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
RunId : 2598486 Language : G++ Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
/***************************************************************\
*Author: 小呼
*Created Time: Tue 13 Jul 2010 10:57:39 AM CST
*File Name: main.cpp
*Description:01背包的变形。这里要求求最小值,只需将max改成min
*另外这里要求必须装满背包。二维的形式f[i][v]表示的是前i种物品
*装到体积为v的背包中恰好装满的最小价值,这样如果f[i][v]不能实现
*(impossible),要用一个无穷大(1000000000)将它标记下,于是f的
*初始化是1000000000,而不再是0.(注释全是按“背包”来写的)
\***************************************************************/
//*========================*Head File*========================*\\
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*----------------------*Global Variable*----------------------*/
int T,E,F,N,P,W,V,f[10010];//变量同题目,f是背包问题中那个一维数组
//*=======================*Main Program*=======================*//
using namespace std;
int main(){
//freopen("input","r",stdin);
scanf("%d",&T);
while(T--){
scanf("%d%d",&E,&F);
V=F-E;//背包容量
scanf("%d",&N);
f[0]=0;//将前0种物品放在容量为0的背包中,最小价值是0
//将前0种物品放在容量为v(v>0)的背包中是impossible的
for(int i=1;i<=V;++i)
f[i]=1000000000;
while(N--){
scanf("%d%d",&P,&W);
for(int v=W;v<=V;++v){
//上面将f[0]初始化为0,这里就不必讨论了
//这样可以快15ms左右
//if(v==W)
// f[v]=min(f[v],P);
//else
f[v]=min(f[v],f[v-W]+P);
}
}
if(f[V]==1000000000)//这是impossible的标志
printf("This is impossible.\n");
else
printf("The minimum amount of money in the piggy-bank is %d.\n",f[V]);
}
return 0;
}