去他喵的dp,去他喵的贪心,直接暴力就完事了
先对两种分别从大到小排序
然后枚举选了几个体积为1的,选的这些肯定是价值最大的那些,用前缀和就完事了,枚举了体积为1的个数体积为2的个数自然就知道了,再加上他们的价值就是总价值
#include<bits/stdc++.h> using namespace std; const int N=100000+10; struct S1 { int id; int v; }s1[N]; struct S2 { int id; int v; }s2[N]; int rear1,rear2; bool cmp1(S1 a,S1 b){return a.v>b.v;} bool cmp2(S2 a,S2 b){return a.v>b.v;} int sum1[N],sum2[N]; int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { int a,b; cin>>a>>b; if(a==1) { s1[++rear1].id=i; s1[rear1].v=b; } else { s2[++rear2].id=i; s2[rear2].v=b; } } sort(s1+1,s1+rear1+1,cmp1); sort(s2+1,s2+rear2+1,cmp2); for(int i=1;i<=rear1;i++) sum1[i]=(sum1[i-1]+s1[i].v); for(int i=1;i<=rear2;i++) sum2[i]=(sum2[i-1]+s2[i].v); int ans=0,cnt1=0,cnt2=0; for(int i=0;i<=rear1;i++) { if(i<=m) { int tans=0; tans+=sum1[i]; if((m-i)/2>0) //总体积-体积为1的总体积就是剩下的体积,出个2就是选的体积为2的个数 { tans=tans+sum2[min((m-i)/2,rear2)]; } if(tans>ans) { ans=tans; cnt1=i; cnt2=min((m-i)/2,rear2); } } } cout<<ans<<endl; for(int i=1;i<=cnt1;i++) cout<<s1[i].id<<" "; for(int i=1;i<=cnt2;i++) cout<<s2[i].id<<" "; cout<<endl; return 0; }