HDOJ2159 FATE

分析:看了很久,是一個二維完全揹包問題,dp值來保存獲得的經驗值,循環的是忍耐度和殺怪的數量,每次來比較是否獲得足夠的經驗值,如果有,則退出循環,得到最大值。

代碼:

#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
struct Num{
    int w,v;
}num[105];
int dp[105][105];
int main()
{
    int n,m,k,s,i,j,p;
    while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
    {
        for(i=1;i<=k;i++)
            scanf("%d%d",&num[i].w,&num[i].v);
        memset(dp,0,sizeof(dp));
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=k;j++)
            {
                for(p=1;p<=s;p++)
                {
                    int flag=1;
                    while(flag*num[j].v<=i&&flag<=p)
                    {
                        dp[i][p]=max(dp[i][p],dp[i-flag*num[j].v][p-flag]+flag*num[j].w);
                        flag++;
                    }
                }
            }
            if(dp[i][s]>=n)
                break;
        }
        if(i>m)
            printf("-1\n");
        else
            printf("%d\n",m-i);
    }
    return 0;
}


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