第34次CCF-CSP认证第4题,货物调度

题目链接TUOJ

这道题是背包DP+贪心。这很明显是分组背包,一个仓库是一组,因为代价是和仓库和数量有关,与具体的货物无关(这也是贪心的基础)。

1.我们遍历每一组,对每一组的物品价值从大到小排序。这是很明显的,再这一组中选一定数量的物品代价就是一定的,我们肯定会选价值较高的才能得到最优解。

2.40000是通过数据范围算出来的最大代价,接下来就是跑分组背包的代码。

cpp 复制代码
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
int n,m,v,b[1005],c[1005],dp[40005];
vector<int>arr[1005];
int main()
{
cin>>n>>m>>v;
for(int i=0;i<n;i++){
	cin>>b[i]>>c[i];
}
int a,t;
for(int i=0;i<m;i++){
	cin>>a>>t;
	arr[t].push_back(a);
}
for(int i=0;i<=n;i++){
	sort(arr[i].begin(),arr[i].end(),greater<int>());
	for(int j=40000;j>=0;j--){
		int sum=0;
		for(int k=0;k<arr[i].size();k++){
			if(b[i]+c[i]*(k+1)<=j){
				sum+=arr[i][k];
				dp[j]=max(dp[j],dp[j-(b[i]+c[i]*(k+1))]+sum);
			}
			else break;
		}
	}
}
for(int i=1;i<=40000;i++){
	if(dp[i]-i>=v){
		cout<<i;
		return 0;
	}
}
	return 0;
}
相关推荐
HZY1618yzh3 分钟前
下一代编程语言出炉
c++·算法
CoderYanger10 分钟前
A.每日一题:856. 括号的分数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
wyhwust20 分钟前
No1-绪论
c++
kiracrimson23 分钟前
选择排序与快速排序:一次选极值,一次分区间
算法·排序算法
无名猿25 分钟前
C++ 对象内存模型:vtable 布局、多继承 vptr、RTTI 与 dynamic_cast 走查
c++·内存管理·调试技巧·现代c++
All for pursuit.43 分钟前
【动态规划-8】152.乘积最大子数组
数据结构·c++·算法·leetcode·动态规划
信奥卷王1 小时前
[GESP202512 六级] 路径覆盖
数据结构·算法
INGNIGHT1 小时前
1861 · 老鼠跳跃(坐标型dp)
数据结构·c++
Lazionr1 小时前
手撕 unordered_set 和 unordered_map,剖析哈希表底层实现
c++·算法
0+1111 小时前
算法 --归并排序
数据结构·算法·排序算法