B. Arpa's weak amphitheater and Mehrdad's valuable Hoses(揹包)滾動陣列吧
阿新 • • 發佈:2018-11-15
有n個女孩,每個女孩有一個體重和顏值,並分為k個朋友團隊。
兩個女孩x,y在同一個團隊的條件是存在a1(x), a2, ..., ak(y) 其中ai 和 ai + 1 是朋友( 1 ≤ i < k).
每個團隊要麼全取,那麼取不超過。問在總重量不超過w的情況下能取到的最大顏值和。
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<queue> #include<vector> using namespace std; int n,m,ww; int w[1005]; int b[1005]; int vis[1005]; int dp[2][1005]; vector<int>e[1005]; int sw,sb; int pre,cur; void dfs(int u) { vis[u]=1; int len=e[u].size(); for(int j=ww;j>=w[u];j--) { dp[cur][j]=max(dp[cur][j],dp[pre][j-w[u]]+b[u]); } for(int i=0;i<len;i++) { int v=e[u][i]; if(vis[v]==0) { dfs(v); } } sw+=w[u]; sb+=b[u]; } int main() { while(~scanf("%d%d%d",&n,&m,&ww)) { memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); for(int i=0;i<=1000;i++) e[i].clear(); for(int i=1;i<=n;i++) { scanf("%d",&w[i]); } for(int i=1;i<=n;i++) { scanf("%d",&b[i]); } for(int i=0;i<m;i++) { int u,v; scanf("%d%d",&u,&v); e[u].push_back(v); e[v].push_back(u); } pre=0,cur=1; for(int i=1;i<=n;i++) { if(vis[i]==0) { sw=sb=0; dfs(i); for(int j=ww;j>=sw;j--) { dp[cur][j]=max(dp[cur][j],dp[pre][j-sw]+sb); } swap(pre,cur); for(int j=ww;j>=0;j--) { dp[cur][j]=dp[pre][j]; } } } printf("%d\n",dp[cur][ww]); } }
//另一種寫法,好像是揹包for迴圈順序調了一下,有道理 #include <bits/stdc++.h> using namespace std; const int maxn=1010; int dp[maxn],be[maxn],we[maxn]; int f[maxn]; int Find(int x) { return f[x]==x?x:f[x]=Find(f[x]); } void megre(int x,int y) { int t1=Find(x); int t2=Find(y); if(t1!=t2){ f[t1]=t2; } } int main() { int n,m,w; while(~scanf("%d %d %d",&n,&m,&w)) { for(int i=1;i<=n;i++) scanf("%d",&we[i]); for(int i=1;i<=n;i++) scanf("%d",&be[i]); for(int i=1;i<=n;i++) f[i]=i; for(int i=1;i<=m;i++){ int x,y; scanf("%d %d",&x,&y); megre(x,y); } vector<int>g[maxn]; for(int i=1;i<=n;i++) g[Find(i)].push_back(i); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ if(Find(i)!=i) continue; for(int j=w;j>=0;j--){ int sum1=0,sum2=0; for(int k=0;k<g[i].size();k++){ sum1+=we[g[i][k]]; sum2+=be[g[i][k]]; if(j>=we[g[i][k]]) dp[j]=max(dp[j],dp[j-we[g[i][k]]]+be[g[i][k]]); } if(j>=sum1) dp[j]=max(dp[j],dp[j-sum1]+sum2); } } printf("%d\n",dp[w]); } return 0; }