hdu(2159)(二维背包)

该题为二维背包
即比一维多加了一个限制条件,同理可以推至多维即是有多个限制条件
#include <stdio.h>
#include <string.h>
struct node
{
    int r,e;
}s[150];
int max(int a,int b)
{
    if (a>b)
    return a;
    else
    return b;
}
int main()
{
    int n,m,k,a,i,l,j,f[100][100];
    while(scanf("%d%d%d%d",&n,&m,&k,&a)!=EOF)
    {
        for (i=1;i<=k;++i)
        {
            scanf("%d%d",&s[i].e,&s[i].r);
        }
        memset(f,0,sizeof(f));
        for (i=1;i<=k;++i)
        for (l=s[i].r;l<=m;++l)//该循环与下一个循环可以交换
        for (j=1;j<=a;++j)
        {
            f[l][j]=max(f[l-s[i].r][j-1]+s[i].e,f[l][j]);
            //f[l][j]表示消耗l忍耐度杀死j只时所获得的价值
            //由动态规划可知其等于max(该只未杀时所消耗的忍耐度+杀死该只得到的价值,当前状态)
            //可能会觉得用一定的忍耐度不一定能杀死那么多的怪兽,但是在该种情况下,对应的f为0,不会有影响
        }
        if (f[m][a]<n)
        printf ("-1\n");
        else
        {
            for (i=0;i<=m;++i)
            if (f[i][a]>=n)
            {
                printf ("%d\n",m-i);
                break;
            }
        }
    }
    return 0;
}

 

posted @ 2013-05-06 19:24  一线添  阅读(131)  评论(0编辑  收藏  举报