hdoj1114

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
/***************************************************************\
*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;
}

你可能感兴趣的:(OJ)