题意:
有n家店铺,每个店铺有一种商品(无限个),每种商品有体积(2的i-1次方),每种商品有价格c[i],问至少买l体积的物品最少需要花费多少钱?
我们利用贪心的方法来解决。 我们优先选择单位体积花费少的商品。
那么我们的排序函数为
bool cmp(Node t1,Node t2)
{
return t1.cost*t2.vol<t2.cost*t1.vol;
}
这是一个很常用的排序方法。
只是我们开始dfs,对于当前状态,我们用最实惠的货品一直买,买到买不下来了。还剩下零星的空间。
这个空间我们有两个选择,第一个就是再买这个商品,因为题目没说不能超过给定的空间,只需要保证达到空间
耗费最少即可。所以我们可以这样。第二个可能就是我们买第二实惠的商品,重复以上过程。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include<queue>
#include<map>
#include<math.h>
using namespace std;
struct Node
{
long long vol;
long long cost;
}s[1100];
bool cmp(Node t1,Node t2)
{
return t1.cost*t2.vol<t2.cost*t1.vol;
}
long long n,l;
long long dfs(long long left,long long cost,long long num)
{
if(num>n)
return 0;
long long cout=left/s[num].vol; //判断当前家需要购买几瓶
cost+=cout*s[num].cost;//加上花费
left-=cout*s[num].vol;//计算剩余体积
if(left==0) return cost; //如果不剩余了,则方案最优,直接返回
return min(cost+s[num].cost,dfs(left,cost,num+1));//处理剩余部分,再买一杯超出需要的量或者去下一家店,两者去最少花费的那种。
}
int main(){
s[1].vol=1;
cin>>n>>l;
cin>>s[1].cost;
for(int i=2;i<=n;i++){
cin>>s[i].cost;
s[i].vol=2*s[i-1].vol;
}
sort(s+1,s+1+n,cmp);
// ll tempm=0;
// ll left=1;
// ll temp;
cout<<dfs(l,0,1)<<endl;
return 0;
}