Starship Troopers HDU - 1011

dp[i][j]表示i房間留下j名士兵獲得的最大價值,揹包問題

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define inf 0x3f3f3f3f

using namespace std;
const int N=2e2;
int n,m,dp[N][N],vis[N],x,y,b[N],c[N];
vector<int> a[N];

void dfs(int x)
{
    for(int i=b[x];i<=m;i++)
        dp[x][i]=c[x];
    vis[x]=1;
    for(int i=0;i<a[x].size();i++)
    {
        int y=a[x][i];
        if(vis[y])
            continue;
        dfs(y);
        for(int j=m;j>=b[x];j--)
        {
            for(int k=1;j+k<=m;k++)
            {
                dp[x][j+k]=max(dp[x][j+k],dp[y][k]+dp[x][j]);
            }
        }
    }
}
int main()
{
    /*ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);*/
    while(cin >> n >> m)
    {
        if(n==-1&&m==-1)
            break;
        memset(vis,0,sizeof(vis));
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
            a[i].clear();
        for(int i=1;i<=n;i++)
        {
            cin >> b[i] >> c[i];
            b[i]=(b[i]+19)/20;
        }
        for(int i=0;i<n-1;i++)
        {
            cin >> x >> y;
            a[x].push_back(y);
            a[y].push_back(x);
        }
        if(m==0)
        {
            printf("0\n");
            continue;
        }
        dfs(1);
        cout << dp[1][m] << endl;
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章