题是完全背包
但是是要求最小值的
要把除了0以外的所有值都初始化为INF
第一次就把dp【rl】初始了
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define INF 0x3f3f3f
using namespace std;
int dp[10005],m[505],w[505];
int main()
{
int t;
int e,f,v,rl,n;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d%d",&e,&f);
rl=f-e;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&m[i],&w[i]);
for(int i=1;i<=rl;i++)
dp[i]=INF;
for(int i=1;i<=n;i++)
for(int j=w[i];j<=rl;j++)
dp[j]=min(dp[j],dp[j-w[i]]+m[i]);
if(dp[rl]==INF) printf("This is impossible.\n");
else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[rl]);
}
return 0;
}
为了更好的理解又用二维数组做了一下。。结果开始各种初始化错
这里面需要给所有的dp[i][0]初始化为0
因为在背包容量为0的时候,只有0才是合法的答案
还有就是完全背包的转移方程
后面是i不是i-1 因为用的是已经更新过的数组来处理数据
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define INF 0x3f3f3f
using namespace std;
int dp[100][10005],m[505],w[505];
int main()
{
int t;
int e,f,v,rl,n;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d%d",&e,&f);
rl=f-e;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&m[i],&w[i]);
for(int i=0;i<=n;i++)
for(int j=0;j<=rl;j++)
dp[i][j]=INF;
for(int i=0;i<=n;i++)
dp[i][0]=0;
for(int i=1;i<=n;i++)
for(int j=w[i];j<=rl;j++){
dp[i][j]=min(dp[i-1][j],dp[i][j-w[i]]+m[i]);
}
if(dp[n][rl]==INF) printf("This is impossible.\n");
else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[n][rl]);
}
return 0;
}