EOJ 2103 小強尋寶I

2021-06-15 10:39:12 字數 1743 閱讀 5321

wa

t^t 不知道為什麼

#include #include #include using namespace std;

const int maxn = 1005;

int n,p;

struct node

e[maxn];

int head[maxn];

int tot;

int cost[maxn];

int key[maxn];

int dp[maxn][maxn];

templateinline void checkmax(t &a, t b)

void init()

void addedge(int u, int v)

void dfs(int u, int pre)

for(int i=head[u];i!=-1;i=e[i].next)

}

}int main()

init();

for(int i=1;i<=n;i++)

scanf("%d%d",&cost[i], &key[i]);

int m = n - 1;

while(m--)

dfs(1,0);

printf("%d\n",dp[1][p]);

} return 0;

}

終於找到錯誤所在了。

上面的寫法明顯是0-1揹包,是在所有的子樹中尋找最大的數,然後加上該節點的值。

實際上,這題是分組揹包,即看每一組能用多少的power,然後尋求最大的

轉移方程:dp[u][p]   第u個結點消耗p單位的power時的最大價值

dp[u][p] = dp[v1][p1] + dp[v2][p1]+ dp[v3][p3] ...

有道類似的題:

#include #include #include using namespace std;

const int maxn = 105;

int n,p;

struct node

e[maxn<<1];

int head[maxn];

int tot;

int cost[maxn];

int key[maxn];

int dp[maxn][maxn];

templateinline void checkmax(t &a, t b)

void init()

void addedge(int u, int v)

void dfs(int u, int pre)

for(int i=head[u];i!=-1;i=e[i].next)

}

}int main()

init();

for(int i=1;i<=n;i++)

scanf("%d%d",&cost[i], &key[i]);

int m = n - 1;

while(m--)

dfs(1,0);

printf("%d\n",dp[1][p]);

} return 0;

}

for(int j=p;j>=cost[u];j--)
for(int j=p;j>=cost[u];j--)

2103 士兵排列問題 ZCMU

題目描述 有 個士兵 1 26 編號依次為 佇列訓練時,指揮官要把一些士兵從高到矮一次排成一行,但現在指揮官不能直接獲得每個人的身高資訊,只能獲得 p1比p2高 這樣的比較 結果 p1 p2 記為 p1 p2 如 表示 比 高。請編一程式,根據所得到的比較結果求出一種字典序最小的排隊方案。注 比較結...

EOJ 莫干山奇遇

出題人當然是希望出的題目有關oxx,於是想方設法給題目配上一些有關oxx的背景故事,使得它看起來不那麼無趣。但有的時候卻無法引入合適的小姐姐,使得oxx顯得非常可憐。所以出題人刪除了故事,只留下乙個枯燥乏味的數學問題。故事已刪除 給乙個長度為n的序列a1,a2,an,求乙個長度為m的序列b1,b2,...

Luogu p2103 道路值守 題解

題目鏈結 這道題很明顯是要用floyd的,所以肯定先用floyd跑一遍,求出任意兩點之間的最路徑。這個資料範圍擺明了讓你o n 3 去過的,於是我們不難發現這道題可以dp來統計答案。跑完floyd後,我們去列舉所有於j有連邊且在i到j的最短路上的k,每找到乙個,就將wzy j 加1。統計完後,我們再...