题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114
题意是有一个存钱罐,当它是空的时候重量为E,满的时候重量为F;已知存钱罐里面有 n 种钱,每种钱的价值为 P 重量为 W ;求存钱罐满的时候里面至少有多少钱;
是一个完全背包(求从n个物品中选出总重量不大于W的最大价值)问题:
二维数组:
(1 <= i <=n; 0<=j<=W)
dp[i][j] = max( dp[i-1][ j], dp[i][ j-w[i] ]+v[i] )(j>=w[i]);
=dp[i-1][j];(j
一维数组:
(1<=i<=n; w[i]<=j<=W)
dp[j]=max( dp[j], dp[ j-w[i] ]+v[i] );
而本题求得是最小价值所以稍微改一下就可以了
#include
#include
#include
#include
using namespace std;
#define N 50100
#define INF 0xfffffff
int dp[N], v[N], w[N], W, n;
int main()
{
int T, E, F;
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &E, &F);
W = F - E;
scanf("%d", &n);
for(int i=; i<=n; i++)
scanf("%d %d", &v\[i\], &w\[i\]);
for(int i=; i<=W; i++)
dp\[i\]=INF;
dp\[\]=;
for(int i=; i<=n; i++)
{
for(int j=w\[i\]; j<=W; j++)
{
dp\[j\]=min(dp\[j\], dp\[j-w\[i\]\]+v\[i\]);
}
}
if(dp\[W\]==INF)
printf("This is impossible.\\n");
else
printf("The minimum amount of money in the piggy-bank is %d.\\n", dp\[W\]);
}
return ;
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章