//E: 给定 n 为 A,B 整型数组的长度,将 a 中所有元素与 b 中所有元素相乘进行累和(各数组 //元素不可重复使用),求其最小值。 //例: //输入: 5 //1 8 -1 4 -2 //0 6 1 -4 -1 //输出: -4
上面为原始题目:
思路为用A和B数组所有元素依次相乘后的所有结果做一个二维数组,然后通过实现二维数组不同行与列的数值相加求最值,方式为递归。
#include <iostream> int n;
bool first(int D[],int a,int step) { for(int i=0;i<step;i++) { if (D[i] == a) return false; } return true; }//这个函数为判断当前列元素是否为当前递归路径下的首次访问
void suanfa(int C[100][100],int x,int min,int &ans,int D[100]) { if(x==n) { if(ans>min) ans=min; return; } for(int y=0;y<n;y++)//循环列元素 { int a=0; if(first(D,y,x))//检查当前列元素是否为首次使用 { min+=C[x][y]; a=1; D[x]=y; suanfa(C,x+1,min,ans,D);//递归让行数+1; } if(a==1) min=min-C[x][y];列元素循环需要判断是否需要退回min值; } }//先把两个数组相乘后写入一个二维数组,然后通过递归让二维数组不同行不同列的元素相加,并的出最小值
int main() { int C[100][100]; int A[100]; int B[100]; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&A[i]); for (int i = 0; i < n; i++) scanf("%d",&B[i]); for(int x=0;x<n;x++) for(int y=0;y<n;y++) C[x][y]=A[x]*B[y];//这里为把两个数组相乘转化为二维数组; int min=0,ans=0; int D[100]; for(int i=0;i<100;i++) D[i]=-1; suanfa(C,0,min,ans,D); printf("%d",ans); return 0; }标签:min,int,元素,累加,二维,数组,ans,100,最值 From: https://blog.csdn.net/2401_83795651/article/details/136924560