-
大小: 3KB文件類(lèi)型: .cpp金幣: 1下載: 1 次發(fā)布日期: 2021-11-10
- 語(yǔ)言: C/C++
- 標(biāo)簽: 動(dòng)態(tài)規(guī)劃??dp??動(dòng)歸??買(mǎi)書(shū)問(wèn)題??01背包??
資源簡(jiǎn)介
買(mǎi)書(shū)問(wèn)題 dp實(shí)現(xiàn)
題目:買(mǎi)書(shū)
有一書(shū)店引進(jìn)了一套書(shū),共有3卷,每卷書(shū)定價(jià)是60元,書(shū)店為了搞促銷(xiāo),推出一個(gè)活動(dòng),活動(dòng)如下:
如果單獨(dú)購(gòu)買(mǎi)其中一卷,那么可以打9.5折。
如果同時(shí)購(gòu)買(mǎi)兩卷不同的,那么可以打9折。
如果同時(shí)購(gòu)買(mǎi)三卷不同的,那么可以打8.5折。
如果小明希望購(gòu)買(mǎi)第1卷x本,第2卷y本,第3卷z本,那么至少需要多少錢(qián)呢?(x、y、z為三個(gè)已知整數(shù))。
1、過(guò)程為一次一次的購(gòu)買(mǎi),每一次購(gòu)買(mǎi)也許只買(mǎi)一本(這有三種方案),或者買(mǎi)兩本(這也有三種方案),
或者三本一起買(mǎi)(這有一種方案),最后直到買(mǎi)完所有需要的書(shū)。
2、最后一步我必然會(huì)在7種購(gòu)買(mǎi)方案中選擇一種,因此我要在7種購(gòu)買(mǎi)方案中選擇一個(gè)最佳情況。
3、子問(wèn)題是,我選擇了某個(gè)方案后,如何使得購(gòu)買(mǎi)剩余的書(shū)能用最少的錢(qián)?并且這個(gè)選擇不會(huì)使得剩余的書(shū)為負(fù)數(shù)
。母問(wèn)題和子問(wèn)題都是給定三卷書(shū)的購(gòu)買(mǎi)量,求最少需要用的錢(qián),所以有"子問(wèn)題重疊",問(wèn)題中三個(gè)購(gòu)買(mǎi)量設(shè)置為參數(shù),
分別為i、j、k。
4、的確符合。
5、邊界是一次購(gòu)買(mǎi)就可以買(mǎi)完所有的書(shū),處理方式請(qǐng)讀者自己考慮。
6、每次選擇最多有7種方案,并且不會(huì)同時(shí)實(shí)施其中多種,因此方案的選擇互不影響,所以有"子問(wèn)題獨(dú)立"。
7、我可以用minMoney[i][j][k]來(lái)保存購(gòu)買(mǎi)第1卷i本,第2卷j本,第3卷k本時(shí)所需的最少金錢(qián)。
8、共有x * y * z個(gè)問(wèn)題,每個(gè)問(wèn)題面對(duì)7種選擇,時(shí)間為:O( x * y * z * 7) = O( x * y* z )。
9、用函數(shù)MinMoney(i,j,k)來(lái)表示購(gòu)買(mǎi)第1卷i本,第2卷j本,第3卷k本時(shí)所需的最少金錢(qián),那么有:
MinMoney(i,j,k)=min(s1,s2,s3,s4,s5,s6,s7),其中s1,s2,s3,s4,s5,s6,s7分別為對(duì)應(yīng)的7種方案使用的最少金錢(qián):
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;
}
/*
題目:買(mǎi)書(shū)
有一書(shū)
- 上一篇:傳智黑馬程序員C++24期完整不加密版
- 下一篇:經(jīng)典平差程序
評(píng)論
共有 條評(píng)論