hdu 2159 fate 二维完全背包

分析:这是一个二维完全背包,首先要找到哪个属性是wight,哪个是value。。根据题意,杀怪数和忍耐度是wight,属于背包。经验值是价值。。然后套用完全背包,只不过这个是二维背包,要再加入一个循环。。这个题要求的是剩余忍耐度。。所以第一个循环可以设置成忍耐度。。只要所求的经验值大于规定,就可跳出循环,简化代码。。

#include<iostream>
using namespace std;
int dp[110][110];
int Max(int a,int b){
    return a>b?a:b;
}
int main()
{
    int i, j, k, n, m, l, s, a[105], b[105], sum;
    while(cin>>n>>m>>l>>s)
    {
        memset(dp, 0, sizeof(dp));
        sum=-1;
        for(i=1; i<=l; i++)
        {
            cin>>a[i]>>b[i];
        }
        for(i=1; i<=m; i++)
        {
            for(j=1; j<=l; j++)
            {
                for(k=1; k<=s; k++)
                {
                    if(i>=b[j])    dp[i][k]=Max(dp[i][k], dp[i-b[j]][k-1]+a[j]);  //需加入一个判断条件,因为第一个循环是忍耐度。
                }
            }
            if(dp[i][s] >= n)
            {
                sum=m-i;break;
            }    
        }
        cout<<sum<<endl;
    }
    return 0;
} 

 

posted @ 2014-03-04 17:24  xtaq  阅读(137)  评论(0编辑  收藏  举报