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。統計完後,我們再...