杭电 1114 Piggy-Bank 动态规划

25 篇文章 0 订阅
7 篇文章 0 订阅

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114
题意:题目意思是给一些硬币,有重量和价值,然后给一个罐子,问在能否在装满罐子的条件下,求到这个罐子的最小价值。

完全背包

详细看代码

不懂背包的首先看这篇:https://blog.csdn.net/qq_37774171/article/details/81206480
AC代码:

#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=a;i<b;i++)
#define rre(i,r,l) for(int i=(r);i>=(l);i--)
#define req(i,l,r) for(int i=(l);i<=(r);i++)
#define mem(a,b) memset(a,b,sizeof(a))
#define op operator
#define endl "\n"
#define MIN_SUM 0x80000000
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
template<typename Q>
void inin(Q &x) {  //读入优化 
	x=0;
	int f=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-')f=1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	x=f?-x:x;
}
#define inf 400000
struct node {
	int value;
	int space;
};
int main() {
	int n;
	node a[510];
	int t;
	int dp[10010];
	while(scanf("%d",&t)!=EOF) {
		while(t--) {
			mem(dp,0);
			int e,f;
			inin(e);
			inin(f);
			inin(n);
			int flag=0;
			_for(i,0,n) {
				inin(a[i].value);
				inin(a[i].space);
				if(a[i].space<=f-e) {  //提前判断 
					flag=1;
				}
			}
			if(!flag) {
				printf("This is impossible.\n");
			} else {
				req(i,1,f-e)  //初始化,因为要求最小,所以设大点 
                    dp[i]=inf;
				_for(i,0,n) {
					req(j,a[i].space,f-e) {   //背包九讲中的公式 
						dp[j]=min(dp[j],dp[j-a[i].space]+a[i].value);
					}
				}
				if(dp[f-e]!=inf) {//看是否装满了 
					printf("The minimum amount of money in the piggy-bank is %d.\n",dp[f-e]);
				} else {
					printf("This is impossible.\n");
				}
			}

		}
	}

    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值