您的位置:首页 > 其它

csu 1547: Rectangle (01背包)

2015-03-29 21:22 447 查看
题意:说有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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: