資源簡介
買書問題 dp實現
題目:買書
有一書店引進了一套書,共有3卷,每卷書定價是60元,書店為了搞促銷,推出一個活動,活動如下:
如果單獨購買其中一卷,那么可以打9.5折。
如果同時購買兩卷不同的,那么可以打9折。
如果同時購買三卷不同的,那么可以打8.5折。
如果小明希望購買第1卷x本,第2卷y本,第3卷z本,那么至少需要多少錢呢?(x、y、z為三個已知整數)。
1、過程為一次一次的購買,每一次購買也許只買一本(這有三種方案),或者買兩本(這也有三種方案),
或者三本一起買(這有一種方案),最后直到買完所有需要的書。
2、最后一步我必然會在7種購買方案中選擇一種,因此我要在7種購買方案中選擇一個最佳情況。
3、子問題是,我選擇了某個方案后,如何使得購買剩余的書能用最少的錢?并且這個選擇不會使得剩余的書為負數
。母問題和子問題都是給定三卷書的購買量,求最少需要用的錢,所以有"子問題重疊",問題中三個購買量設置為參數,
分別為i、j、k。
4、的確符合。
5、邊界是一次購買就可以買完所有的書,處理方式請讀者自己考慮。
6、每次選擇最多有7種方案,并且不會同時實施其中多種,因此方案的選擇互不影響,所以有"子問題獨立"。
7、我可以用minMoney[i][j][k]來保存購買第1卷i本,第2卷j本,第3卷k本時所需的最少金錢。
8、共有x * y * z個問題,每個問題面對7種選擇,時間為:O( x * y * z * 7) = O( x * y* z )。
9、用函數MinMoney(i,j,k)來表示購買第1卷i本,第2卷j本,第3卷k本時所需的最少金錢,那么有:
MinMoney(i,j,k)=min(s1,s2,s3,s4,s5,s6,s7),其中s1,s2,s3,s4,s5,s6,s7分別為對應的7種方案使用的最少金錢:
s1 = 60 * 0.95 + MinMoney(i-1,j,k)
s2 = 60 * 0.95 + MinMoney(i,j-1,k)
s3 = 60 * 0.95 + MinMoney(i,j,k-1)
s4 = (60 + 60) * 0.9 + MinMoney(i-1,j-1,k)
s5 = (60 + 60) * 0.9 + MinMoney(i-1,j,k-1)
s6 = (60 + 60) * 0.9 + MinMoney(i-1,j,k-1)
s7 = (60 + 60 + 60) * 0.85 + MinMoney(i-1,j-1,k-1)
代碼片段和文件信息
#include
#define?MAX?8888
using?namespace?std;
int?xyz;
int?mm[50][50][50];
int?min(int?s1int?s2int?s3int?s4int?s5int?s6int?s7)
{
int?mini=s1;
if?(s2 if?(s3 if?(s4 if?(s5 if?(s6 if?(s7 return?mini;
}
int?MinMoney(int?iint?jint?k)
{
int?s1s2s3s4s5s6s7s8s9;?
if?(i==0&&j==0&&k==0)?return?0;
if?(i!=0)?s1?=?60?*?0.95?+?MinMoney(i-1jk);?else?s1=MAX;
if?(j!=0)?s2?=?60?*?0.95?+?MinMoney(ij-1k);?else?s2=MAX;
if?(k!=0)?s3?=?60?*?0.95?+?MinMoney(ijk-1);?else?s3=MAX;
if?(i!=0&&j!=0)?s4?=?(60?+?60)?*?0.9?+?MinMoney(i-1j-1k);?else?s4=MAX;
if?(i!=0&&k!=0)?s5?=?(60?+?60)?*?0.9?+?MinMoney(i-1jk-1);?else?s5=MAX;
if?(j!=0&&k!=0)?s6?=?(60?+?60)?*?0.9?+?MinMoney(ij-1k-1);?else?s6=MAX;
if?(i!=0&&j!=0&&k!=0)?s7?=?(60?+?60?+?60)?*?0.85?+?MinMoney(i-1j-1k-1);?else?s7=MAX;
return?min(s1s2s3s4s5s6s7);
}
int?main(void)
{
cin>>x>>y>>z;
cout< return?0;
}
/*
題目:買書
有一書
- 上一篇:傳智黑馬程序員C++24期完整不加密版
- 下一篇:經典平差程序
評論
共有 條評論