经典多重背包都是已知V求最大值
本题是已知V,求最小价值
只需把状态方程里的 max变成min即可
状态变量F[0..v]初始值不再是最大值的0了,请注意。
#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;
#define MAX_V (500+1)
#define MAX_F (10000+1)
int E,F,N;
int P[MAX_F],W[MAX_F];
int M;
int Value[MAX_F];
#define inf (2000000000)
#define printf //
int main()
{
int T;
cin>>T;
for(int t=1;t<=T;t++)
{
cin>>E>>F;
M=F-E;
cin>>N;
for(int j=1;j<=N;j++)
{
cin>>P[j]>>W[j]; //W是重量 P是价值
printf("j=%d P[]=%d,W[]=%d\n",j,P[j],W[j]);
}
memset(Value,0,sizeof(Value));
//求最小这里应该为inf
for(int v=0;v<MAX_F;v++)
Value[v] = inf;
Value[0] = 0;
for(int j=1;j<=N;j++)
{
for(int v=W[j];v<=M;v++)
{
int vi_1_index = v-W[j];
if(Value[vi_1_index] == inf)
continue;
int vi_1 = Value[ vi_1_index ] + P[j];
if( vi_1 < Value[v])
Value[v] = vi_1;
printf("j=%d v=%d vi_1=%d Value[%d]=%d\n",j,v,vi_1,Value[v],vi_1_index);
}
}
// int minv = inf;
// for(int v=0;v<=M;v++)
// if(Value[v] < minv)
// minv = Value[v];
int minv = Value[M];
if(minv == inf)
{
cout<<"This is impossible."<<endl;
}
else
{
cout<<"The minimum amount of money in the piggy-bank is "<<minv<<"."<<endl;
}
}
}