HDU 1561 The more ,The Better
生活随笔
收集整理的這篇文章主要介紹了
HDU 1561 The more ,The Better
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
The more, The Better
Time Limit: 6000/2000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4960????Accepted Submission(s): 2927
Problem Description ACboy很喜歡玩一種戰略游戲,在一個地圖上,有N座城堡,每座城堡都有一定的寶物,在每次游戲中ACboy允許攻克M個城堡并獲得里面的寶物。但由于地理位置原因,有些城堡不能直接攻克,要攻克這些城堡必須先攻克其他某一個特定的城堡。你能幫ACboy算出要獲得盡量多的寶物應該攻克哪M個城堡嗎?
Input 每個測試實例首先包括2個整數,N,M.(1 <= M <= N <= 200);在接下來的N行里,每行包括2個整數,a,b. 在第 i 行,a 代表要攻克第 i 個城堡必須先攻克第 a 個城堡,如果 a = 0 則代表可以直接攻克第 i 個城堡。b 代表第 i 個城堡的寶物數量, b >= 0。當N = 0, M = 0輸入結束。
Output 對于每個測試實例,輸出一個整數,代表ACboy攻克M個城堡所獲得的最多寶物的數量。
Sample Input 3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 0 0
Sample Output 5 13樹型DP+背包問題!AC碼:#include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; #define MAX 205 vector<int> adj[MAX]; int f[MAX][MAX],tot[MAX],weight[MAX]; int m; int max(int a,int b) {return a>b?a:b; } int DFS(int u) {tot[u]=1;f[u][1]=weight[u];int i,j,k,v;for(i=0;i<adj[u].size();i++){v=adj[u][i];tot[u]+=DFS(v);}for(i=0;i<adj[u].size();i++){v=adj[u][i];for(j=tot[u];j>=1;j--){for(k=1;k<j&&k<=tot[v];k++)f[u][j]=max(f[u][j],f[u][j-k]+f[v][k]);}}return tot[u]; } int main() {int n,i,u;while(~scanf("%d%d",&n,&m)&&(n+m)){for(i=0;i<=n;i++)adj[i].clear();for(i=1;i<=n;i++){scanf("%d%d",&u,&weight[i]);adj[u].push_back(i);}memset(f,0,sizeof(f));m++;DFS(0);printf("%d\n",f[0][m]);}return 0; }
總結
以上是生活随笔為你收集整理的HDU 1561 The more ,The Better的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 张一鸣:做CEO要避免理性的自负
- 下一篇: 程序员的三门课之项目管理篇