// http://www.spoj.com/problems/PIGBANK/
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define Max 10000
// dp(x) means the minimal value of conins with weight x.
int dp[Max+1];
// temp(x) means whether there is a solution to get minimal value of conins with weight x.
bool temp[Max+1];
// w(x) the weight of conin x
// v(x) the value of conin x
int w[500],v[500];
int main()
{
int T,E,F,N;
int i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&E,&F,&N);
for(i=0;i<N;i++)
scanf("%d%d",&v[i],&w[i]);
memset(dp,0,sizeof(dp));
memset(temp,0,sizeof(temp));
temp[0]=true;
// variable i means the ith coin
for(i=0;i<N;i++)
{
// variable j means weight j, assuming the conin is ordered according to their weights.
for(j=w[i];j<=Max;j++)
{
dp(w) = min(f(w-wi))
if(temp[j-w[i]]&&dp[j]!=0)
{
// if: weight of (j - w[i]) has a solution and weight of j already has a solution
// then: compare current solution and the solution by adding ith coin, choose the smaller one
dp[j]=dp[j]<dp[j-w[i]]+v[i]? dp[j]:dp[j-w[i]]+v[i];
temp[j]=true;
}
else if(temp[j-w[i]]&&dp[j]==0)
{
// if: weight of (j-w[i]) has a solution, and weight of j does not have a solution so far
// then: assign current solution by adding ith conin weight and value.
dp[j]=dp[j-w[i]]+v[i];
temp[j]=true;
}
cout << "dp[" << j << "]=" << dp[j] << endl;
}
}
if(temp[F-E]==false)
{
printf("This is impossible.\n");
}
else
{
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[F-E]);
}
}
return 0;
}
SPOJ PIGBANK
最新推荐文章于 2022-08-23 16:32:57 发布