搭配购买

题面

上手发现与01背包仅差一个组合购买,于是愉快并查集+01背包

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 int father[20001],c[20001],w[20001],f[20001];
 7 int n,m,k,x,y;
 8 
 9 int find(int x) 
10 {
11     return x==father[x]?x:father[x]=find(father[x]);
12 }
13 
14 int main()
15 {
16     scanf("%d%d%d",&n,&m,&k);
17     for (int i=1;i<=n;i++)
18     {
19         scanf("%d%d",&w[i],&c[i]);
20         father[i]=i;  //初始化
21     } 
22     for (int i=1;i<=m;i++)
23     {
24         scanf("%d%d",&x,&y);
25         if (find(x)!=find(y)) father[find(y)]=find(x);  
26     }
27     for (int i=1;i<=n;i++)
28      if (father[i]!=i) 
29      {
30         c[find(i)]+=c[i];
31         w[find(i)]+=w[i]; 
32         c[i]=w[i]=0; 
33      }
34     for (int i=1;i<=n;i++)
35      for (int j=k;j>=w[i];j--)
36       f[j]=max(f[j],f[j-w[i]]+c[i]); 
37     printf("%d\n",f[k]);
38     return 0;
39 }

 

转载于:https://www.cnblogs.com/ainiyuling/p/11136987.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值