这道题想买东西还得搭配着买,我们把每个连通块设置为一个物品就中咧
动态规划dp流程
step1:定义状态表示,f[i][j]表示从1到i里选物品,价钱不超过j的最大价值
step2:推导状态转移方程
step3:初始化
全部初始化为0即可
step4:确定填表顺序
i从上到下 j无所谓
step5;结果,存在f[n][m]里
如果二维优化成一维
j必须从右到左
代码实现:
#include <iostream>
#include <vector>
using namespace std;
const int N = 1e4+10;
int n,m,t;
int w[N],v[N];
int w1[N],v1[N];
int cnt;
bool st[N];
int f[N];
vector<int> edges[N];
void dfs(int x)
{
w1[cnt]+=w[x];
v1[cnt]+=v[x];
st[x] = true;
for(auto & e : edges[x])
{
if(!st[e])
{
dfs(e);
}
}
}
int main()
{
cin >> n >> m >> t;
for(int i = 1;i<=n;i++)
{
cin >> v[i] >> w[i];
}
for(int i = 1;i<=m;i++)
{
int a,b;cin >> a >> b;
edges[a].push_back(b);
edges[b].push_back(a);
}
for(int i = 1;i<=n;i++)
{
if(!st[i])
{
cnt++;
dfs(i);
}
}
for(int i = 1;i<=cnt;i++)
{
for(int j = t;j>=v1[i];j--)
{
f[j] = max(f[j],f[j-v1[i]]+w1[i]);
}
}
cout << f[t] << endl;
return 0;
}