动态规划的一些题目及解法

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

猜你喜欢

转载自blog.csdn.net/weixin_38241876/article/details/84945953