由于L的范围特别大,所以不能直接背包做,然后我们想一想为什么背包问题不能贪心去做,本质上是因为性价比最高的物体会可能导致空间无法充分利用,而这题则不存在这个问题(可以从二进制的角度去想,比如把L写成二进制,那么最高位的1可以由所有商品买若干个获得,且总是需要获得,所以对于这个最高位的1来说他是可以贪心的。),所以我们可以贪心地尽量多地选取性价比高的物品。
然后再贪心选完了之后还要考虑余下的部分:可以再继续选一个当前物品(体积会超出但是价格却是最低的,或者余下的部分继续搜索,需要加个记忆化或者先排个序贪心的去选)。
#include <iostream>
using namespace std;
typedef long long ll;
int n,L;
ll c[33];
int main()
{
cin>>n>>L;
for(int i=0;i<n;i++)
{
cin>>c[i];
if(i)c[i]=min(c[i],c[i-1]*2);
}
for(int i=n;i<31;i++)
c[i]=2*c[i-1];
ll ans=0;
for(int i=0;i<31;i++)
{
if(ans>c[i])ans=c[i];
if(L&(1<<i))ans+=c[i];
}
cout<<ans<<endl;
}