标签:ka hdu6007 int auto cin pb Crystal Mr dp
思路:先求出每个道具的最小造价,再跑完全背包即可。
我们不停的用 当前已得最小造价的道具来更新当前道具可以合成的道具,类似于dij求最短路那样。就能获得每个道具的最小花费了。
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
#define fi first
#define se second
#define pb push_back
#define wzh(x) cerr<<#x<<'='<<x<<endl;
int t,m,n,k,cas;
int st[N];
int a[N],b[N];
int dp[10005];
struct uzi{
int a;
vector<pair<int,int>>v;
bool sta;
int pos;
}p[N];
vector<int>v[N];
int main() {
ios::sync_with_stdio(false);
for(cin>>t,cas=1;cas<=t;cas++){
cin>>m>>n>>k;memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
v[i].clear();
cin>>st[i];
if(st[i]){
cin>>a[i]>>b[i];
}else{
cin>>b[i];
a[i]=1e9;
}
}
priority_queue<pair<LL,int > >Q;
vector<uzi>res;
for(int i=1;i<=k;i++){
int x,y;
cin>>x>>y;
vector<pair<int,int> >QQ;
for(int j=1;j<=y;j++){
int e,f;
cin>>e>>f;
v[e].pb(i);
QQ.pb({e,f});
}
p[i]= {x,QQ,0,i};
res.pb(p[i]);
}
auto get=[&](vector<pair<int,int>>&v){
LL tot=0;
for(auto ka:v){
tot+=1ll*ka.se*a[ka.fi];
}
return tot;
};
for(int i=1;i<=n;i++){
if(st[i]){
Q.push({-a[i],i});
}
}
while(!Q.empty()){
auto x=Q.top();
Q.pop();
for(auto ka:v[x.se]){
LL tmp=get(p[ka].v);
if(a[p[ka].a]>tmp){
a[p[ka].a]=tmp;
Q.push({-a[p[ka].a],p[ka].a});
}
}
}
for(int i=1;i<=n;i++){
for(int j=a[i];j<=m;j++){
dp[j]=max(dp[j],dp[j-a[i]]+(int)b[i]);
}
}
cout<<"Case #"<<cas<<": "<<dp[m]<<'\n';
}
return 0;
}
标签:ka,hdu6007,int,auto,cin,pb,Crystal,Mr,dp 来源: https://blog.csdn.net/qq_40655981/article/details/110308174
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。