HDU 1114 Piggy-Bank

本文介绍了一个使用动态规划解决完全背包问题的C++实现案例。通过一个具体的程序示例,详细解释了如何计算在给定容量限制下达到目标值所需的最小代价。文章包括完整的代码解析及注释,适合初学者理解完全背包问题及其算法实现。

完全背包问题

dp[j]=min(dp[j-w[i]]+p[i],dp[j]);

dp[j-w[i]]+p[i]表示放进重量为w[i],价值为p[i]的物品,dp[j]表示不放此物品。

#include <iostream>
#include <cstdio>
#define INF 0x6fffffff
#define min(a,b) a<b?a:b;
using namespace std;

int dp[10005];
int main()
{
	int empty,fill,maxw;
	int n,i,j;
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int p[1005],w[1005];
		scanf("%d%d",&empty,&fill);
		maxw=fill-empty;
		scanf("%d",&n);
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&p[i],&w[i]);
		}
		for(i=0;i<=maxw;i++)
		{
			dp[i]=INF;
		}
		dp[0]=0;
		for(i=0;i<n;i++)
		{
			for(j=w[i];j<=maxw;j++)
			{
				dp[j]=min(dp[j-w[i]]+p[i],dp[j]);
			//	cout<<dp[j]<<' ';
			}
		//	cout<<endl;
		}
		if(dp[maxw]<INF)
			printf("The minimum amount of money in the piggy-bank is %d.\n",dp[maxw]);
		else printf("This is impossible.\n");
	}
	return 0;
}





评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值