hdu2159

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

#include
using namespace std;
#include
#include
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         {
            scanf("%d%d",&Aa[i].p,&Aa[i].q);
            Aa[i].s=1;
        }
        int v;
        int t;
     for(i=0;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]         int Max=ss.m;
        for( v=1;v<=ss.m;v++)
        {
         for(t=1;t<=ss.s;t++)
          if(f[v][t]>=n&&v         }
        cout<}
return 0;
}

你可能感兴趣的:(动态规划)