HDU 2159 FATE

本文介绍了一种在完全背包问题基础上增加特定条件的算法实现,即在限定杀死怪物数量的情况下,寻找经验值最大化的解决方案。通过动态规划的方法,记录每个忍耐点上能够获得的最大经验值,并确保不超过规定的怪物数量。

该题只是在完全背包基础之上加了一个条件,就是只能杀s个怪,那么我们就对每次记录每次在该忍耐点所杀的怪,如果所杀的怪大于所给的数目,那么我们就不更换经验值。怎样计算所剩的忍耐点,我们知道每一个忍耐点都是所杀怪所得到的经验值最大,那么我们只要对f进行遍历一遍,如果经验值大于等于所给的经验值,代表在该忍耐点已经可以获得了升级。

#include<stdio.h>
#include<stdlib.h>
int DP( int add[],int reduce[], int n, int m, int k,int s )
{
    int f[124]={0},hash[124]={0},;
    for( int i=1; i<=k; i++ )
    {
          for( int j=0; j<=m; j++ )
             if( j>=reduce[i]&&f[j]<(f[j-reduce[i]]+add[i])&&hash[j-reduce[i]]+1<=s )
             {
                f[j]=f[j-reduce[i]]+add[i] ;
                hash[j]=hash[j-reduce[i]]+1;
             } 
    }
    for( int j=0;j<=m; j++ )
    {
        if( f[j]>=n )
          return m-j;
    }
    return -1;    
}
int main()
{
    int n,m,k,s,add[124],reduce[124];
    while( scanf( "%d%d%d%d",&n,&m,&k,&s )!=EOF )
    {
        for( int i=1;i<=k; i++ )
         scanf( "%d%d",&add[i],&reduce[i] );
         printf( "%d\n",DP( add, reduce,n,m,k,s ) );       
    }
    return 0;    
}

  

转载于:https://www.cnblogs.com/bo-tao/archive/2011/08/11/2135544.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值