1. 程式人生 > >動態規劃的一些題目及解法

動態規劃的一些題目及解法

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))