杭电 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