完全背包

来源:互联网 发布:佶天鸿淘宝 编辑:程序博客网 时间:2024/05/29 11:04

杭电 2159

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;struct node{    int val,wei;} a[105];int dp[105][105];int main(){    int n,m,k,s,x,y,z,i;    //升级还需经验值 忍耐度 怪物种数 最多杀怪数    while(~scanf("%d%d%d%d",&n,&m,&k,&s))    {        //怪物的数值 经验 耐久        for(i = 1; i<=k; i++)            scanf("%d%d",&a[i].val,&a[i].wei);        memset(dp,0,sizeof(dp));        //耐久值        for(x = 1; x<=m; x++)        {            //每只怪物            for(y = 1; y<=k; y++)            {                //杀几只怪物                for(z = 1; z<=s; z++)                {                    int cnt = 1;                    while(cnt*a[y].wei<=x && cnt<=z)                    {                        //杀z只怪物时 杀cnt只y怪物的值                        dp[x][z] = max(dp[x][z],dp[x-cnt*a[y].wei][z-cnt]+cnt*a[y].val);                        cnt++;                    }                }            }            if(dp[x][s]>=n)                break;        }        if(x>m)            printf("-1\n");        else            printf("%d\n",m-x);    }    return 0;}
0 0
原创粉丝点击