hdu 3496 二维0-1背包

来源:互联网 发布:淘宝服装质检标准 编辑:程序博客网 时间:2024/06/10 19:55

 http://acm.hdu.edu.cn/showproblem.php?pid=3496

很典型的一道二维背包的题目,在保证时间不超出l的情况下还要保证碟片恰好为m。第一次做二维背包,错了n多次,原来才发现数组中应该为i,不应该为j。

 

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>

using namespace std;

const int inf=100000000;

struct node
{
   int t,v;
}a[103];

int dp[103][1003];//dp[i][j]表示买i部花费时间为j的碟片所获得的价值
int n,m,l;

int main()
{
   int t;
   scanf("%d",&t);
   while(t--)
   {
      memset(a,0,sizeof(a));
      scanf("%d%d%d",&n,&m,&l);
      for(int i=0;i<n;i++)
         scanf("%d%d",&a[i].t,&a[i].v);
     
      //初始化这一块,如果是恰好能装满除dp[0][0]=0外,
      //其余都初始化为负无穷
      for(int i=0;i<=n;i++)
         for(int j=0;j<=l;j++)
            dp[i][j]=-inf;
      dp[0][0]=0;
      for(int i=0;i<n;i++)
      {
         int minx=min(i+1,m);
         for(int j=minx;j>0;j--)
         {
            for(int k=l;k>=a[i].t;k--)
               dp[j][k]=max(dp[j][k],dp[j-1][k-a[i].t]+a[i].v);//这里wrong了n次,原来写成j了。。。。。。。
         }
      }
      //if(dp[m][l]==0) {cout<<"0"<<endl;continue;}
      int maxx=-1;
      for(int i=1;i<=l;i++)
         if(maxx<dp[m][i])
            maxx=dp[m][i];
      if(maxx==-1) {cout<<"0"<<endl;continue;}
      printf("%d\n",maxx);
   }
  
   return 0;
}

 

原创粉丝点击