题意:说有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 ",res); } return 0; }