一个公司应聘的数学问题

在这里插入图片描述
首先模拟过程,发现它是一个动态规划类型的问题,再使用全排列将所有情况列出即可写出代码
在这里插入图片描述

#include <cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=1e3;
int a[N],b[N];
int c[N][N];//存放全排列结果
int arr[N][N];//存放原始数据
int sign[N][N];//存放修改过的数据
int n,p=1,res=1e6;
void dfs(int i){
	if(i>=n+1){
		for(int k=1;k<=n;k++){
		    c[p][k]=a[k];
	    }
        p++;
		return ;
	}
	else{
		for(int j=1;j<=n;j++){
			if(!b[j]){
				b[j]=1;
				a[i]=j;
				dfs(i+1);
				b[j]=0;
			}
		}
	}
}
int main(){
    // freopen("D:\\YJ.txt","r",stdin)
    cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=3;j++){
			cin>>arr[i][j];
		}
	}
    dfs(1);//全排列
    for(int k=1;k<p;k++){
        for(int i=1;i<=4;i++){
		    for(int j=1;j<=3;j++){
			    sign[c[k][i]][j]=max(sign[c[k][i-1]][j],sign[c[k][i]][j-1])+arr[c[k][i]][j];//max的意思是取两个值中的最大值
                // cout<<sign[c[k][i]][j]<<" ";//测试使用
		    }
            cout<<endl;
	    }
        res=min(res,sign[c[k][n]][3]);//取两个值中的最小值
        memset(sign,0,sizeof(sign));//初始化sign数组
	}
    cout<<res;
    return 0;
}

数学建模概论的题目,使用c++实现了一下

发布了43 篇原创文章 · 获赞 7 · 访问量 1247

猜你喜欢

转载自blog.csdn.net/Young_Naive/article/details/104385371
今日推荐