这道题是背包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;
}