题目一:买书
有一书店引进了一套书,共有3卷,每卷书定价是60元,书店为了搞促销,推出一个活动,活动如下:
如果单独购买其中一卷,那么可以打9.5折。
如果同时购买两卷不同的,那么可以打9折。
如果同时购买三卷不同的,那么可以打8.5折。
如果小明希望购买第1卷x本,第2卷y本,第3卷z本,那么至少需要多少钱呢?(x、y、z为三个已知整数)。
当然,这道题完全可以不用动态规划来解,但是现在我们是要学习动态规划,因此请想想如何用动态规划来做?
分析:其实就是有3本的情况就优先购买三卷,剩下有2本的就购买两卷,最后剩下的一卷的就单独买了。类似贪心?
用DP做的话如下:
#include<stdio.h>
#include<string.h>
int a[100][100][100];
int min(int x, int y, int z)
{
if(a[x][y][z]) return a[x][y][z];
if(x == 0 && y == 0 && z == 0) return 0;
if(x != 0 && y == 0 && z == 0)
return min(x-1, y, z) + 60*0.95;
if(x == 0 && y != 0 && z == 0)
return min(x, y-1, z) + 60*0.95;
if(x == 0 && y == 0 && z != 0)
return min(x, y, z-1) + 60*0.95;
//
if(x == 0 && y != 0 && z != 0)
return min(x, y-1, z-1) + 120*0.9;
if(x != 0 && y == 0 && z != 0)
return min(x-1, y, z-1) + 120*0.9;
if(x != 0 && y != 0 && z == 0)
return min(x-1, y-1, z) + 120*0.9;
//
if(x != 0 && y != 0 && z != 0)
return min(x-1, y-1, z-1) + 180*0.85;
}
int main()
{
int x, y, z;
memset(a, 0, sizeof(a));
scanf("%d%d%d",&x,&y,&z);
printf("%d\n",min(x, y, z));
return 0;
}