CF3B Lorry
Greedy
将两种体积的物体分类
组内按价值从大往小排序
枚举A物品选几个,算出B最多能选几个
这样既可
代码:
#include<bits/stdc++.h> using namespace std; struct node{ int rank; int value; }; const int N=100005; int n,m; node a[N],b[N]; int s[N]; int cnta=0,cntb=0; int ans1=-1,ans21=-1,ans22=-1,sum=0,opt=0; bool cmp(node x,node y){ return x.value>y.value?1:0; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ int x,y; scanf("%d%d",&x,&y); if(x==1) a[++cnta].value=y,a[cnta].rank=i; else b[++cntb].value=y,b[cntb].rank=i; } sort(a+1,a+cnta+1,cmp); sort(b+1,b+cntb+1,cmp); s[0]=0; for(int i=1;i<=cntb;i++){ s[i]=s[i-1]+b[i].value; } a[0].value=0; for(int i=0;i<=min(cnta,m);i++){ opt+=a[i].value; sum=opt; int u=(m-i)/2; sum+=s[min(u,cntb)]; if(ans1==-1){ ans1=sum; ans21=i; ans22=min(cntb,u); } else if(sum>ans1){ ans1=sum; ans21=i; ans22=min(cntb,u); } } printf("%d\n",ans1); for(int i=1;i<=ans21;i++) printf("%d ",a[i].rank); for(int i=1;i<=ans22;i++) printf("%d ",b[i].rank); printf("\n"); return 0; }