csu 1547: Rectangle (01背包)

题意:说有1*x和2*x的长方形(1和2只能作为宽 )
有一个2*m的空间
问如何组合才能使m的值最小 思路:对2x的长方形不需要得讨论
对1x的长方形的记录总长度 并01背包
找到最接近sum/2 的值

 

#include<cstdio>

#include<iostream>

#include<cstring>

#include<cmath>

#include<stdlib.h>

#include<algorithm>

#include<queue>

#include<stack>

#include<ctype.h>

using namespace std;

const int MAXN=100+5;

int vis[10000+100];

int a[MAXN];

int cmp(int a,int b)

{

    return a>b;

}

int main()

{

    int t;

    scanf("%d",&t);

    while(t--)

    {

        int n,ans=0,cnt=0,res=0,maxn=0,minn,numa=0,numb=0,sum=0;

        scanf("%d",&n);

        for(int i=0;i<n;i++)

        {

            int op,num;

            scanf("%d %d",&op,&num);

            if(op==2) ans+=num;

            if(op==1) {a[cnt++]=num;sum+=num;}

        }

        if(cnt>0)

        {

           memset(vis,0,sizeof(vis));

           vis[0]=1;

           for(int i=0;i<cnt;i++)

           {

               for(int j=10000;j>=a[i];j--)

               {

                   if(vis[j-a[i]]==1) vis[j]=1;

               }

           }

           int hsum=(sum+1)/2;

           int l=hsum;//r=hsum;

           while(vis[l]==0)

           {

               l--;

           }

           maxn=max(l,sum-l);

        }

        res=ans+maxn;

        printf("%d\n",res);

    }

    return 0;

}

  

你可能感兴趣的:(背包)