代码:
int main()
{
int y=read();int m=read();
for (re int i=1;i<=m;++i)
{
a[i]=read();
b[i]=read();
}
int cost=0x3f3f3f3f,_max=0;//总最小花费与最大质量
//类似于状态压缩的表示法,相当于搜索
for (re int i=0;i<=(1<<(m))-1;++i)
{
int price=0,weight=0;//本次花费和质量
for (re int j=1;j<=m;++j)
{
if ( (i & (1<<(j-1)) ) != 0 )
{
price+=a[i];
weight+=b[i];
}
}
if (price<=y)
{
if (weight>_max)
{
_max=weight;
cost=price;
}
else if (weight==_max)
{
cost=min(cost,price);
}
}
}
y-=cost;
int x=read();
//正常完全背包
for (re int i=1;i<=x;++i)
{
int c,d;
c=read();
d=read();
for (re int j=c;j<=y;++j)
{
dp[j]=max(dp[j],dp[j-c]+d);
}
}
int ans=0;
for (re int i=0;i<=y;++i)
{
ans=max(ans,dp[i]);
}
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}