题意:存钱罐可以往里面放一些价值小的钱,但是时间久了就不知道里面有多少钱了,除非你打破它。现在给出空罐子的重量和最满能装到多重,然后给出每种硬币的价值和重量,我们要在不打破它的情况下确认罐子里最少有多少钱。
for i 1~n;
for j w[i]~weight;
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
由于
http://blog.csdn.net/tbwood/article/details/22747215
这个大牛说过。当前状态至于上一个状态的当前位置和上一个状态的前一个位置有关,可以用一维数组。
dp[i]=max(dp[j],dp[j-w[i]]+v[i]);
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 10010;
const int inf = 0x3f3f3f3f;
int c[maxn];
int v[maxn];
int dp[maxn];
int main()
{
int T;
cin>>T;
while(T--)
{
int E,F;
cin>>E>>F;
int n;
cin>>n;
for(int i=1;i<=F-E;i++) dp[i]=inf;
for(int i=1;i<=n;i++) cin>>c[i]>>v[i];
for(int i=1;i<=n;i++)
{
for(int j=v[i];j<=F-E;j++)
{
dp[j]=min(dp[j-v[i]]+c[i],dp[j]);
}
}
if(dp[F-E]>=inf) cout<<"This is impossible."<<endl;
else
{
printf("The minimum amount of money in the piggy-bank is %d.\n", dp[F-E]);
}
}
}