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