程式設計之美之飲料供貨問題
阿新 • • 發佈:2019-02-11
對程式設計之美中飲料供貨問題的解法一進行了優化,當然依然是根據原書中虛擬碼之後的說明文字所提示,之間附上程式碼:
//原書中虛擬碼 int Cal(int V, int T) { opt[0][T] = 0; for(int i=1;i<=V;i++) { opt[i][T] = -INF; } for(int j=T-1;j>=0;j--) { for(i=0;i<=V;i++) { opt[i][j] = -INF; for(int k=0;k<=C[j];k++) { if(i<k*V[j]) { break; } int x = opt[i-k*V[j]][j+1]; if(x != -INF) { x += H[j]*k; if(x>opt[i][j]) { opt[i][j] = x; } } } } } return opt[V][0]; } //優化虛擬碼段 int Cal2(int V, int T) { opt[0][1] = 0; for(int i=1;i<=V;i++) { opt[i][1] = -INF; } for(int j=T-1;j>=0;j--) { for(int i=0;i<=V;i++) { opt[i][0] = -INF; for(int k=0;k<=C[j];k++) { if(i<k*V[j]) { break; } int x = opt[i-k*V[j]][1]; if(x != -INF) { x += H[j]*k; if(x>opt[i][0]) { opt[i][0] = x; } } } } for(int i=0;i<=V;i++) { opt[i][1] = 0; } } return opt[V][0]; }
宣告:虛擬碼大部分是從原書中拷貝過來的,只是做了較少的修改。
解法一,自下而上,屬於歸納;解法二(見原書P45),自上而下,屬於演繹。