HDU 2159 二维完全背包

来源:互联网 发布:在淘宝网怎么投诉卖家 编辑:程序博客网 时间:2024/05/21 07:02

建议同学先看看01背包,完全背包,多重背包和二维背包。

学到的东西就是判别ans这个变量是否变化而判断有没有解。

因为只是一个break不能跳出所有,是不能保证j是最优解的。

AC代码

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>using namespace std;const int maxn=110;const int inf=0x3f3f3f3f;//解决方法是二维完全背包,但题目并不想要完全背包的结果。//人家想要用尽量少的忍耐度和杀尽量少的怪。//所以只要最早dp出来的结果大于他想要的经验值,那就是他想要的结果。int dp[maxn][maxn];int v[maxn];int w[maxn];int main(){    int m,n,k,s;    while(scanf("%d%d%d%d",&n,&m,&k,&s)==4)//需要经验、忍耐度、怪种数、最多杀怪数    {        memset(dp,0,sizeof(dp));        memset(v,0,sizeof(v));        memset(w,0,sizeof(w));        for(int i=1;i<=k;i++) scanf("%d%d",&v[i],&w[i]);        int ans=10000000;        bool f=0;        for(int i=1;i<=k;i++)        {            for(int j=w[i];j<=m;j++)            {                for(int q=1;q<=s;q++)                {                    dp[j][q]=max(dp[j][q],dp[j-w[i]][q-1]+v[i]);                    if(dp[j][q]>=n&&j<ans)                    {                        ans=j;                        //printf("j=%d获得经验值:%d\n",j,dp[j][q]);                    }                }            }        }        if(ans!=10000000) printf("%d",m-ans);        else printf("-1");        printf("\n");    }}