完全背包问题!但是求的是最小值,不是最大值!所以初始化的时候做下改变!
求最大价值:要求恰好装满背包,那么在初始化时除了dp[0]为0其它dp[1..V]均设为-∞
求最小价值:要求恰好装满背包,那么在初始化时除了dp[0]为0其它dp[1..V]均设为∞
#include<stdio.h>
#define inf 0xfffffff
struct node
{
int value,weight;
}a[510];
int dp[10000];
void CompleteBack(int v,int n)
{
int i,j;
for(i=0;i<=v;i++)
dp[i]=inf;
dp[0]=0;
for(i=0;i<n;i++)
for(j=a[i].weight;j<=v;j++)
if(dp[j]>dp[j-a[i].weight]+a[i].value)
dp[j]=dp[j-a[i].weight]+a[i].value;
}
int main()
{
int t,x,y,v,m,i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&x,&y);
v=y-x;
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d%d",&a[i].value,&a[i].weight);
CompleteBack(v,m);
if(dp[v]==inf)
printf("This is impossible.\n");
else
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[v]);
}
//for(;;);
return 0;
}
杭电 1114(完全背包)
最新推荐文章于 2020-02-18 16:10:30 发布