/*蠻力法解決全排列問題*/#include<iostream>#include<string>usingnamespace std;voidinsert(char c1[],char c2[],char c,int i)//將c 插入c1 并將c1復制到c2{int j;for(j =0; j < i; j++)c2[j]= c1[j];c2[i]= c;for(j = i +1; j <=strlen(c1)+1; j++)c2[j]= c1[j -1];}voidperml(int n)//為生成排列集合元素的個數{int i, j, k, m =1;char**c[2];//采用兩個字符序列存儲,分別存儲i-1和i的全排列c[1]=newchar*[1];c[1][0]=newchar[2];c[1][0][0]='1'; c[1][0][1]=0;for(i =2; i <= n; i++){m = m*(i -1);c[i %2]=newchar*[m*i];for(j =0; j < m; j++){for(k =0; k < i; k++){c[i %2][j*i + k]=newchar[i +1];insert(c[(i +1)%2][j], c[i %2][j*i + k],char(i +'0'), k);}delete[] c[(i +1)%2][j];}delete[] c[(i +1)%2];}for(i =0; i < m*n; i++){cout <<"第"<< i +1<<"排列:"<< c[n %2][i]<< endl;delete[] c[n %2][i];}}intmain(){perml(3);return0;}
生成子集 字典序
list_1=[]
list_2=[]
answer=[]
n=int(input("input:"))for i in range(0,n):list_1.append(input("input:"))list_2.append(0)
sum1=0
i=n-1print(answer)while sum1<n:i=n-1if list_2[i]==0:list_2[i]=1else:list_2[i]=0while i>0:if list_2[i-1]==1:list_2[i-1]=0i=i-1else:list_2[i-1]=1breaksum1=sum(list_2)for i in range(0,n):if list_2[i]==1:answer.append(list_1[i])print(answer)answer.clear()
list_weight=[]
list_vlaue=[]
list_2=[]
maxweight=int(input("輸入背包最大容量:"))
n=int(input("input n:"))for i in range(0,n):list_weight.append(int(input("輸入第"+str(i+1)+"件物品的重量:")))list_vlaue.append(int(input("輸入第"+str(i+1)+"件物品的價值:")))list_2.append(0)
sum1=0
sumw=0
sumv=0
i=n-1while sum1<n:i=n-1sw=0sv=0if list_2[i]==0:list_2[i]=1else:list_2[i]=0while i>0:if list_2[i-1]==1:list_2[i-1]=0i=i-1else:list_2[i-1]=1breaksum1=sum(list_2)for i in range(0,n):if list_2[i]==1:sw=sw+list_weight[i]sv=sv+list_vlaue[i]if sw<maxweight and sv>sumv:sumw=swsumv=svprint(sumv)
任務分配問題 假設有n個任務需要分配給n個人執行,每個任務只分配給一個人,每個人只分配一個任務,且第j個任務分配給第i個人的成本是C [ i, j ]1<=i,j<=n),任務分配問題要求找出總成本最小的分配方案。
import random
import matplotlib.pyplot as pinput =int(input('輸入生成點的數量:'))
dot =[[0]*3for i in range(input)]
x =[[0]*2for a in range(int(input *(input -1)/2))]
y =[[0]*2for b in range(int(input *(input -1)/2))]
fg = p.figure()
cn = fg.add_subplot(1,1,1)
cn.set_xlim(0,1000)
cn.set_ylim(0,1000)
p.ion()for i in range(input):dot[i][0]= random.randrange(1000)dot[i][1]= random.randrange(1000)dot[i][2]=0def judge(inp):n =0for i in range(inp):for j in range(i +1, inp):a = dot[j][1]- dot[i][1]b = dot[i][0]- dot[j][0]c =(dot[i][0]* dot[j][1])-(dot[i][1]* dot[j][0])sign1 =0sign2 =0x[n][0]= dot[i][0]x[n][1]= dot[j][0]y[n][0]= dot[i][1]y[n][1]= dot[j][1]n +=1for k in range(inp):if k == j or k == i:continueif a * dot[k][0]+ b * dot[k][1]== c:sign1 +=1sign2 +=1if a * dot[k][0]+ b * dot[k][1]> c:sign1 +=1if a * dot[k][0]+ b * dot[k][1]< c:sign2 +=1if(sign1 ==(inp -2))or(sign2 ==(inp -2)):dot[i][2]=1dot[j][2]=1cn.scatter(dot[i][0], dot[i][1], color='g', marker='.')cn.scatter(dot[j][0], dot[j][1], color='g', marker='.')cn.plot(x[n -1], y[n -1], color='b')cn.scatter(dot[i][0], dot[i][1], color='g', marker='.')cn.scatter(dot[j][0], dot[j][1], color='g', marker='.')cn.plot(x[n -1], y[n -1], color='r')p.pause(0.1)cn.lines.pop()judge(input)print("凸包極點:")for i in range(input):if dot[i][2]==1:print((dot[i][0], dot[i][1]))