動態規劃的一些題目及解法
阿新 • • 發佈:2018-12-11
1、假設有幾種硬幣,如1、3、5,並且數量無限。請找出能夠組成某個數目的找零所使用最少的硬幣數。
解法:
#include<stdio.h> int sum=0; void Min(int n) { if(n<1) Sum+=0; else if(n==1||n==3||n==5) sum+=1; else { if(n>=5) { n-=5; sum+=1; Min(n); } else if(n>=3) { n-=3; sum+=1; Min(n); } else if(n>=1) { n-=1; sum+=1; Min(n); } } } int main() { int n; scanf("%d",&n); Min(n); printf("%d\n",sum); return 0; }
2、給定一個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有路徑中最小的路徑和。
import numpy as np n=10 def CreateMatrix(m,n): Matrix=[] for i in range(m*n): Matrix.append(np.random.randint(1,100)) Matrix=np.reshape(Matrix,[m,n]) return Matrix s=0 def Min(M,i,j): global s global n if i==n-1 and j==n-1: return s else : if i==0 and j==0: s+=M[i][j] if i+1<=n-1: x=M[i+1][j] else: x=999 if j+1<=n-1: y=M[i][j+1] else: y=999 if x<y: s+=x Min(M,i+1,j) else: s+=y Min(M,i,j+1) M=CreateMatrix(n,n) print(M) Min(M,0,0) print(s)
3、有一個汽車公司,有兩條生產線,每條生產線有n個裝配站。生產線i的第j個裝配站的生產時間記為Cij。當汽車底盤進入生產線後可以在它完成任意一道裝配工序j之後將其挪到另一條生產線的j+1裝配站上。移動汽車底盤消耗的時間為tij,表示底盤完成了在裝配站Sij上的工作之後,另一條生產線上裝配站j+1上的時間。ei表示各條生產線上底盤的進入時間,xi表示生產完成後的離開時間,求生產的最小總時間。
import numpy as np #構造每個裝配站的生產時間等引數 def make(n): C=[] t=[] e=[] x=[] for i in range(n*2): C.append(np.random.randint(25,45)) C=np.reshape(C,[2,n]) for i in range((n-1)*2): t.append(np.random.randint(3,10)) t=np.reshape(t,[2,n-1]) for i in range(2): e.append(np.random.randint(1,5)) for i in range(2): x.append(np.random.randint(1,5)) return C,t,e,x #求全域性最優解的函式 def func(n,C,t,e,x): if n==0: return 0 else: return min(f1(n,C,t,e)+x[0],f2(n,C,t,e)+x[1]) #生產線1的最優解的遞迴函式 def f1(n,C,t,e): if n==1: return e[0]+C[0][n-1] else: return min(f1(n-1,C,t,e)+C[0][n-1],f2(n-1,C,t,e)+t[1][n-2]+C[0][n-1]) #生產線2的最優解的遞迴遞迴函式 def f2(n,C,t,e): if n==1: return e[1]+C[1][n-1] else: return min(f2(n-1,C,t,e)+C[1][n-1],f1(n-1,C,t,e)+t[0][n-2]+C[1][n-1]) if __name__ == '__main__': C,t,e,x=make(1) print(func(1,C,t,e,x))