1 solutions
-
0
C++ :
#include<bits/stdc++.h> using namespace std; int f[10100];//存储物品之间的关系 int q[10100],v[10100];//价钱、价值 int dp[10100];//以拥有的钱来定义背包容量 //查:查询元素的根 int find(int x){ return f[x]==x?x:f[x]=find(f[x]); } //并:合并元素xy void merge(int x,int y){ int fx = find(x); int fy = find(y); if(fx != fy){ f[fx] = fy; } } int main() { int n,m,w; cin>>n>>m>>w; //n个物品的价钱和价值 for(int i = 1;i <= n;i++){ cin>>q[i]>>v[i]; //并查集初始化 f[i] = i; } //m个物品的关系 int x,y; for(int i = 1;i <= m;i++){ cin>>x>>y; merge(x,y); } //将有关系的物品合并到这组物品的根上 for(int i = 1;i <= n;i++){ //该物品不是根,则将价钱和价值都合并到根上 if(f[i] != i){ q[find(i)]+=q[i]; v[find(i)]+=v[i]; //将该组物品的价钱和价值清零 q[i]=0; v[i]=0; } } //01背包计算结果 for(int i = 1;i <= n;i++){ //从背包容量(有多少钱)~该物品的价钱降序 for(int j = w;j >= q[i];j--){ dp[j] = max(dp[j],dp[j-q[i]]+v[i]); } } cout<<dp[w]; return 0; }
- 1
Information
- ID
- 9970
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By