題意:你作為星河站隊的leader,手下有m個trooper;現在讓你去攻占乙個基地:有n個洞穴組成,
入口是洞穴1,
洞穴之間用n-1條邊鏈結,每個洞穴裡面包括x個
bugs,和他們的brains,你的每個trooper可以消滅20個bugs;問你最多可以得到多少個brains。
需要注意的是:你沒做過的葉子必須要留人,也就是說就算某個地方的bug是0個,你也要牌乙個trooper過去。
寫這個題目的時候,開始用的是以前的依賴揹包的思想,而且**也是按照依賴揹包寫的,寫的比較長,也比較繁瑣,主要思路是:
因為入口是1,所以從1開始,設p=1,p是訪問到的節點編號,設dp[i]表示i是需要的trooper數量,當作**,dp[i]是得到的brains數量,當作價值:
1、遍歷p的所有孩子,如果p的孩子i還有孩子,p=i,轉到1,遍歷完以後,如果所有的孩子都沒有子孩子,轉到2,否組轉到3;
2、對所有的孩子進行01揹包:初始化dp都是p的價值,然後進行01揹包,然後把dp[i]對應的值都後移p的**。
因為如果想到到達p的孩子,必須到達p。然後回溯到上一層1,繼續遍歷p;
3、由於p的有些孩子還有孩子,那麼處理的時候就要按照不同的情況進行01和分組揹包處理,對於沒有孩子的孩子,按照01揹包處理,對於有孩子的孩子,對其進行分組揹包的處理,然後回溯到上一層1繼續遍歷p;
**如下:
/*#include #include #include #include #include using namespace std;
#define n 110
int num,total_price,dp[n][n];
struct roomroom[n];
bool visited[n];
vector connected[n];
void init()
for(i=1;i=room[key].price;j--)}}
}int main()
room[n*n];
bool map[n][n],de_room[n],de_map[n];
list tree[n];
int num,total_price,ans,num_i,num_j;
void update(int key)
}list ::iterator p=tree[key].begin();
while(p!=tree[key].end())
}void fun(int key)
}else
}tree[*p].clear();
}p++;
}tree[key].clear();
if(key==num_i)
for(i=total_price;i>=0;i--)
if(i+room[key].price<=total_price)
}}int main()
for(i=1;i
**如下:
#include #include #include #include #include using namespace std;
#define n 110
int num,total_price,dp[n][n];
struct roomroom[n];
bool visited[n];
vector connected[n];
void init()
for(i=1;i=room[key].price;j--)}}
}int main()
{ while(cin>>num>>total_price&&((num+1)||(total_price+1)))
{init();
if(!total_price)
{cout<<"0"<
hdu1011(揹包樹形DP)
沒有完全理解這題,m個人,攻打乙個map,map的入口是1,在攻打某個結點之前要先攻打其他乙個結點 dp i j 表示m個人攻打以第i個結點為根節點的子樹得到的最優解 狀態轉移dp i j max dp i j dp i k dp t j k 其中t是i結點的子節點 如下 include inclu...
HDU 1011 星河戰隊 樹形DP
題意是說在乙個洞穴中有許多房間,每個房間中有一些蟲子和大腦,這些房間之間用隧道相連形成一棵樹,士兵們殺蟲子的能力有限,也可以直接殺死蟲子而不消耗士兵戰鬥力,但這樣就無法得到房間中的大腦,士兵們不能走回頭路,問給定士兵數量時能得到的大腦最大值。在樹上進行動態規劃,對於每個節點來說,選擇了它,就要損失士...
HDU 攻城堡 (依賴揹包 樹形dp)
acboy很喜歡玩一種戰略遊戲,在乙個地圖上,有n座城堡,每座城堡都有一定的寶物,在每次遊戲中acboy允許攻克m個城堡並獲得裡面的寶物。但由於地理位置原因,有些城堡不能直接攻克,要攻克這些城堡必須先攻克其他某乙個特定的城堡。你能幫acboy算出要獲得盡量多的寶物應該攻克哪m個城堡嗎?每個測試例項首...