(dp,挺好的题)杭电 3602题2012

杭电 3602题2012

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3602

#include<iostream>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int n, m, k;
int dp[10010];//dp[i],到money=i时,所需要的位置。10^7复杂度
int dd(int a, int b) {
	int ct = a / k + 1;//需要几条船
	if (ct * k >= a + b)return a + b;//装的下
	else return ct * k + b;//装不下;
}
int main() {
	int t;
	cin >> t;
	while (t--) {
		cin >> n >> m >> k;
		int a, b;
		memset(dp, INF, sizeof(dp));
		dp[0] = 0;//注意
		while (n--) {
			cin >> a >> b;
			a++;//注意,我忘记加上总统了,嘿嘿嘿
			for (int i = 10000; i >= b; i--) {//注意,如果i从前往后,那么会重复计算某个国家,所以要从后往前
				if (dp[i - b] != INF) {
					dp[i] = min(dp[i], dd(dp[i - b], a));//找赚的钱相同下最小的容纳量
				}
			}

		}int i;
		for (i= 10000; i >= b; i--) {
			//if(dp[i]<=m*k)
			if ((dp[i] + k - 1) / k <= m)
			
				break;
		}
		cout << i << endl;
		
	}
	return 0;
}


参考了大佬的代码,我自己做当时没思路,所以参考了大佬的代码https://blog.csdn.net/chen_ze_hua/article/details/52535867?utm_source=blogxgwz3&ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%9D%AD%E7%94%B53602&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-52535867.pc_search_result_before_js

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值