hdu2159

二维背包。二维背包也是可以当做一维背包来做的,虽然有点贪心的那中没证明的思想,但是的却是对的。讲讲二维的想法。它主要是有两个限制条件,那么这两个限制条件我们分两次来讨论就好了。无非是在一维的基础上增加一个而已。这时候我们将最多的s个当成另一个背包的容量,那么怪的消耗就是1,数据只有100,总共三个for也就是100W而已。作为一维背包的话,就是完全背包。刚好是s个的时候,我们知道s越大产生的值越大这是常识。多以有这么两种做的方式,今天没有卡时间和空间,以后有卡时间和空间的就要用一维背包来做。

#include<iostream>
using namespace std;
#include<stdio.h>
#include<cstring>
struct S
{
    int m;
    int s;///怪的数量的最大值
}ss;
struct guai
{
   int p;///经验值
   int q;///忍耐度
   int s;///怪的数量
}Aa[105];
int f[105][105];
int main()
{
    int n,k;
    int i,j;
    while(cin>>n>>ss.m>>k>>ss.s)
{
   memset(f,0,sizeof(f));
   memset(Aa,0,sizeof(Aa));
for(i=0;i<k;i++)
        {
            scanf("%d%d",&Aa[i].p,&Aa[i].q);
            Aa[i].s=1;
        }
        int v;
        int t;
     for(i=0;i<k;i++)
        for( v=Aa[i].q;v<=ss.m;v++)
        for( t=Aa[i].s;t<=ss.s;t++)
         {
             f[v][t]=max(f[v-Aa[i].q][t-Aa[i].s]+Aa[i].p,f[v][t]);
         }
        if(f[ss.m][ss.s]<n){cout<<"-1"<<endl;continue;}
        int Max=ss.m;
        for( v=1;v<=ss.m;v++)
        {
         for(t=1;t<=ss.s;t++)
          if(f[v][t]>=n&&v<Max)Max=v;
        }
        cout<<ss.m-Max<<endl;
}
return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值