2014 Super Training #7 C Diablo III --背包問題(DP)

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   2014   

原題: ZOJ 3769 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3769

一個帶有一些限制的背包問題。

假設在沒有限制的情況下,那麼定義:dp[i][j]表示在前 i 類物品中,總的Toughness為 j 的時候最大的傷害值。

取到第K類的第x個物品時(屬性值為D,T),則有轉移方程: dp[K][j+T] = max(dp[K][j+T],dp[K-1][j]+D) .其中j+T超過m時按m算就可以了。

但是有限制如下:

1、對於兩個手指的,無論是只裝備一根手指,還是裝備了兩隻,都用手指這一類來表示,那麼,所有手指裝備本身當作只裝備一根手指,裝備兩隻的兩兩枚舉一下

2、對於Weapon和Shield兩種道具以及Two-Handed,我們還是把它們當成一種來處理,首先各自肯定當成一件物品,然後就是枚舉Weapon和Shield的搭配了當成一種,將這些歸為一類

 

代碼:

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <algorithm>#include <string>#include <vector>using namespace std;#define N 50007string god[15] = {"Head", "Shoulder", "Neck", "Torso", "Hand", "Wrist", "Waist", "Legs", "Feet", "Finger", "Shield", "Weapon", "Two-Handed"};struct Good{    int damag,tough;    Good(int _damg,int _togh)    {        damag = _damg;        tough = _togh;    }    Good(){}};vector<Good> G[14];int getnum(string ka){    for(int i=0;i<13;i++)    {        if(god[i] == ka)            return i;    }}int dp[13][N];int main(){    int i,j,k;    string ss;    int t,n,m;    int damag,tough;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        for(i=0;i<=13;i++)            G[i].clear();        for(i=0;i<n;i++)        {            cin>>ss;            scanf("%d%d",&damag,&tough);            k = getnum(ss);            G[k].push_back(Good(damag,tough));            if(k == 10 || k == 11)  //weapon or sheild,一併算在Two_handed裡面                G[12].push_back(Good(damag,tough));        }        //枚舉weapon and sheild ‘s combination        for(i=0;i<G[10].size();i++)            for(j=0;j<G[11].size();j++)                G[12].push_back(Good(G[10][i].damag+G[11][j].damag,G[10][i].tough+G[11][j].tough));        G[10].clear();        G[11].clear();        //G[10] 存放finger所有的情況(單獨和組合)        for(i=0;i<G[9].size();i++)        {            G[10].push_back(G[9][i]);            for(j=i+1;j<G[9].size();j++)                G[10].push_back(Good(G[9][i].damag+G[9][j].damag,G[9][i].tough+G[9][j].tough));        }        G[9].clear();  //注意清空,情況都加到G[10]裡面去了        memset(dp,-1,sizeof(dp));        dp[11][0] = 0;        int T,D;        for(i=0;i<G[12].size();i++)        {            Good g = G[12][i];            T = min(g.tough,m);            dp[11][T] = max(dp[11][T],g.damag);        }        for(k=10;k>=0;k--)        {            for(i=0;i<=m;i++)            {                dp[k][i] = max(dp[k][i],dp[k+1][i]);                if(dp[k+1][i] == -1)                    continue;                for(j=0;j<G[k].size();j++)                {                    Good g = G[k][j];                    T = min(g.tough+i,m);                    D = g.damag+dp[k+1][i];                    dp[k][T] = max(dp[k][T],D);                }            }        }        printf("%d\n",dp[0][m]);    }    return 0;}
View Code

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.