背包专题小结

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
//树形DP
//题意: n间房子,m个士兵;每个士兵可以在一个房间里解决20个bug,不足20个也要一个
//      士兵,这些房子是树形结构,每次到达一个房子,必须把它前面的房子里的bug解决
//      了;
//      然后给n个房间的bug数,和解决这些bug得到的利益。
//      然后给的是房间的树形结构。
//      总是从编号为1的房间作为入口。
//解题思路:
//     前向星存图,并不要存成树,存成一个图,还是双向的。
//
struct Node
{
    int now,to;
}edge[105];
int cnt,head[105],vis[105];
void init()
{
    cnt=0;
    memset(head,-1,sizeof(head));
    memset(vis,0,sizeof(vis));
}
void add(int no,int to)
{
    edge[cnt].now=no;
    edge[cnt].to=head[to];
    head[to]=cnt++;
}
int bug[105],p[105];
int n,m;
int dp[105][105];//在i点放j人能得到的最多的能量;
int dfs(int root)
{
    vis[root]=1;
    int cost = (bug[root]+19)/20;
    for(int i=cost;i<=m;i++)
        dp[root][i]=p[root];//小于cost的无法获得经验;
    for(int i=head[root]; i!=-1; i=edge[i].to)
    {
        int v=edge[i].now;
        if(!vis[v])
        {
            dfs(v);
            for(int j=m;j>=cost;j--)
                for(int k=1;j+k<=m;k++)
                    if(dp[v][k])
                        dp[root][j+k]= max(dp[root][j+k],dp[root][j]+dp[v][k]);
        }
    }
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==-1 && m ==-1)
            break;
        for(int i=1;i<=n;i++)
            scanf("%d%d",&bug[i],&p[i]);
        init();
        for(int i=1;i<n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            add(x,y);
            add(y,x);
        }
        if(!m)
        {
            printf("0\n");
            continue;
        }
        memset(dp,0,sizeof(dp));
        dfs(1);
        printf("%d\n",dp[1][m]);
    }
    return 0;
}
时间: 2024-10-27 09:59:24

背包专题小结的相关文章

搜索专题小结及例题:POJ2251&amp;POJ1426&amp;POJ3087&amp;POJ2488

图的遍历也称为搜索,就是从图中某个顶点出发,沿着一些边遍历图中所有的顶点,且每个顶点仅被访问一次,遍历可采取两种不同的方式:深度优先搜索(DFS)和广度优先搜索(BFS). 1.DFS算法思想` 从顶点v出发深度遍历图G的算法 ① 访问v0顶点,置vis[v0]=1,搜索v0未被访问的邻接点w,若存在邻接点w,则dfs(w),直到到达所有邻接点都被访问过的顶点u为止,接着退回一步,看是否还有其他没有被访问的邻接点.如果有,则访问此顶点,进行前述类似的访问,如果没有,就在退回一步进行搜索,重复上述

【背包专题】 D - Coins hdu2844【多重背包】

Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hibix opened purse and found there were some coins. He decided to buy a very nice watch in a nearby shop. He wanted to pay the exact price(without change) and he kn

01背包专题

>>什么是01背包<< A - Bone Collector Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to co

【背包专题】H - 钱币兑换问题 hdu1284【完全背包】

在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. Input每行只有一个正整数N,N小于32768.Output对应每个输入,输出兑换方法数.Sample Input 2934 12553 Sample Output 718831 13137761 思路:完全背包来解决这道题.先递推出只兑换1分硬币时的兑换方法有多少种,再递推出加入2分硬币后的兑换方法数,最后递推出加入3分硬币后的兑换方法数. #include<stdio.h> #includ

【背包专题】C - The trouble of Xiaoqian hdu3591【混合背包:多重背包+完全背包】

In the country of ALPC , Xiaoqian is a very famous mathematician. She is immersed in calculate, and she want to use the minimum number of coins in every shopping. (The numbers of the shopping include the coins she gave the store and the store backed

【背包专题】F - Ahui Writes Word hdu3732【01背包+二进制优化】

We all know that English is very important, so Ahui strive for this in order to learn more English words. To know that word has its value and complexity of writing (the length of each word does not exceed 10 by only lowercase letters), Ahui wrote the

背包专题(持续更新)

POJ 3624 Charm Bracelet 题目链接:http://poj.org/problem?id=3624 Description Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fill it with the best charms possible from the N (1 ≤ N ≤ 3,402) available charms

【背包专题】I - 湫湫系列故事——减肥记I hdu4508【完全背包】

对于吃货来说,过年最幸福的事就是吃了,没有之一!  但是对于女生来说,卡路里(热量)是天敌啊!  资深美女湫湫深谙“胖来如山倒,胖去如抽丝”的道理,所以她希望你能帮忙制定一个食谱,能使她吃得开心的同时,不会制造太多的天敌. 当然,为了方便你制作食谱,湫湫给了你每日食物清单,上面描述了当天她想吃的每种食物能带给她的幸福程度,以及会增加的卡路里量. Input 输入包含多组测试用例.  每组数据以一个整数n开始,表示每天的食物清单有n种食物.  接下来n行,每行两个整数a和b,其中a表示这种食物可以

【背包专题】G - Dividing hdu 1059【多重背包】

Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbles. This would be easy if all the marbles had the same value, because then they could just split the colle