今天看了看背包九讲的完全背包。估计是因为只记住了方程,没理解透的原因。照着写,还是错了;错就错在初始化的时候,我全部初始化为0了,然后用max;但是得不到答案。可是初始化出0位置以外,其他都为无穷大,取min,过了、、、额。。。去问问高手吧我。
再研究了下,猛然回头,发现,是求背包装满的 最小价值、、、
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int oo = 1000000000; //无穷大
int P[503],W[503],dp[10003] = {0}; //dp[0] = 0;
int main()
{
int T,E,F,N,i,j;
cin>>T;
while(T--)
{
cin>>E>>F;
cin>>N;
for(i = 1; i <= N; i++)
{
cin>>P[i]>>W[i];
}
//memset(dp,oo,sizeof(dp));dp[0]; 为什么这样不行呢?
for (i=1;i<=F;i++) dp[i]=oo; //dp[1...F] 无穷大
F -= E;
for( i = 1; i <= N; i++)
for( j = W[i]; j <= F; j++)
{
//if (dp[j-W[i]]+P[i]<dp[j]) dp[j]=dp[j-W[i]]+P[i];
dp[j] = min(dp[j-W[i]]+P[i], dp[j]); //状态转移方程(关键)
}
if(dp[F] == oo)
cout<<"This is impossible."<<endl;
else
cout<<"The minimum amount of money in the piggy-bank is "<<dp[F]<<"."<<endl;
}
}