Souvenir
Accepts: 1186
Submissions: 2743
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 262144/262144 K (Java/Others)
题目大意是说:有一种商品,可以单个购买,也可以成组购买,问买n个最低价格。
最暴力的解法就是枚举每一种组合,计算总价取最低,但是效率太低,这里我们使用动态规划。
1.数组res[i].lowcost表示买i件商品的最低价格,因为不要求正好买i个,所以虽然价格最低,但可能多余i个,res[i].left表示多出来的部分
2.如果要购买i个商品,可以选择使用套餐或者不使用套餐,我们当然是选取其中价格更低的,根据i和m的大小,分为两种情况:
(1)i>m 如果不使用套餐,需要的价格为res[i-m].lowcost+m*p,使用套餐的价格为res[i-m].lowcost+q
(2)i<=m 不使用套餐为i*p,不使用套餐为q
#include <iostream>
#define MAX 10010
using namespace std;
struct good
{
long long lowcost;
int left;
};
int main()
{
good res[MAX];
int n,m,p,q;
int t;
cin>>t;
while(t--)
{
cin>>n>>m>>p>>q;
res[1].lowcost=p;
res[1].left=0;
for(int i=1;i<=n;i++)
{
if(i-m>0)
{
int cmp;
if(m-res[i-m].left>0)
cmp=m-res[i-m].left;
else
cmp=0;
res[i].lowcost=min(res[i-m].lowcost+cmp*p,res[i-m].lowcost+q);
}
else
{
res[i].lowcost=min(i*p,q);
}
//lowcost[i]=min(lowcost[i],(i-m)>0?lowcost[i-m]+q:q);
}
cout<<res[n].lowcost<<endl;
}
return 0;
}