HDU 2159

来源:互联网 发布:二值化算法程序 编辑:程序博客网 时间:2024/06/05 09:32
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=300;int n,m,k,s;int a[maxn],b[maxn];int dp[maxn][maxn];int main(){    while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)    {        for(int i=1;i<=k;i++)        {            scanf("%d%d",&a[i],&b[i]);        }        memset(dp,0,sizeof(dp));        int maxs=-10000;        for(int i=1;i<=k;i++)        {            for(int j=b[i];j<=m;j++)            {                for(int l=1;l<=s;l++)                {                    dp[j][l]=max(dp[j][l],dp[j-b[i]][l-1]+a[i]);                }            }        }        int f=0;        for(int i=0;i<=m;i++)        {            if(f)                break;            for(int j=0;j<=s;j++)            {                if(dp[i][j]>=n)                {                    maxs=i;                    f=1;                 break;                }            }        }        if(f)            printf("%d\n",m-maxs);        else            printf("-1\n");    }    return 0;}

很新颖的一个题目啊,用到了二维的背包问题啊,之前背包九讲只看到第三节的多重背包,因为这个问题,又把第五节的二维看了一下,就可以解这个题目了,要注意三重循环因为背包的原型是完全背包问题,因此后两重得要是顺序的顺序来进行读取的,然后就是要特别注意每一重循环的i,j,l的含义是什么,最外层是有几种的物品可以选入。

还要注意就是这个最后是满足经验值后的忍耐值还剩余多少。

而且在后两重的循环里谁先【】【】在哪个先无所谓,无非是一个行列的问题,事实上是一样的。

0 0
原创粉丝点击