动态规划资源最优分配算法用C++实现
各位高手帮帮忙啊,谢谢!!!
[解决办法]
没有instance,无法回答。
//运输或资源分配类问题,其实很好理解,我们找张纸,先把数据按照这个格式抄下来//最后一列是供应数,最后一行是需求数2 1 3 2 601 3 2 1 403 4 1 1 5020 35 33 34//第一步,找到价格是最低的,1块钱的//第一行第二列,产是60,需是35,//把60个产量,拿35个满足之;//可以分配的产量就是25//需求就是0了,表就变成了下边2 1 3 2 [25]1 3 2 1 403 4 1 1 5020 [0] 33 34//重复这个过程,直到产方全是0,或者供方全是0//就完成了。
[解决办法]
#include<iostream>using namespace std; #define M 10 // 最多资源份量#define N 10 // 最多工程数量 int g[M+1][N]; // 资源分配利润函数int solve[N]; // 最优分配方案int m, n; // 资源数与工程数 int dp(){ int f[M+1][N]; // 资源分配最多利润 int d[M+1][N]; // 资源分配方案 int best; // 资源分配最优方案可得利润best, int bi, bj; // 最优时资源分配给了前bi个项目,共分配bj份资源 int i,j,k; // 先得到只有第一个工程时的利润 for(i=0; i<=m; i++){ f[0][i] = g[0][i]; d[0][i] = i; } // 计算n个工程的资源分配表 for(i=1; i<n; i++){ f[i][0] = g[i][0] + f[i-1][0], d[i][0] = 0; // 当为0时解直接相加 for(j=1; j<=m; j++){ f[i][j] = f[i][0], d[i][j] = 0; // 初始化为不分配给该工程资源时的解 for(k=0; k<=j; k++){ // 计算分配给其若干个资源时的最优解 if(f[i-1][j-k] + g[i][k] > f[i][j]){ f[i][j] = f[i-1][j-k] + g[i][k]; d[i][j] = k; } } } } // 寻找最优分配方案 for(i=0; i<n; i++){ for(j=0; j<=m; j++){ if(f[i][j]>best){ best = f[i][j]; bi = i, bj = j; } } } // 计算每个工程各消耗多少资源 memset(solve, 0, sizeof(solve)); k = bj; for(i=bi; i>=0; i--){ // bi以后的项目都不用分配 solve[i] = d[i][k]; k-=solve[i]; } return best;} int main(){ int i,j; cin>>m>>n; for(i=0; i<n; i++){ for(j=0; j<=m; j++){ cin>>g[i][j]; } } cout<<"最优分配方案可得利润:"<<dp()<<endl; cout<<"最优分配方案:"<<endl; for(i=0; i<n; i++){ cout<<"工程"<<(i+1)<<"分配:"<<solve[i]<<"资源"<<endl; } return 0;}
[解决办法]
你这个例子有问题,因为用眼睛都能看出来,把资源全部都给第3个是最好的。
下面的代码,可以求出任意组合的最大值。
<SCRIPT LANGUAGE="JavaScript">var value=[[0,4,26,40,45,50,51,52,53],[0,5,15,40,60,70,73,74,75],[0,5,15,40,80,90,95,98,100]];var count=[0,0,0];var maxValue=0;var result=""; function F(c,sumValue) { if(c==8){ if(sumValue>maxValue){ maxValue=sumValue; result=count.toString(); } return; } for(var x=0;x<3;x++){ F(c+1,sumValue+value[x][++count[x]] ); count[x]--; } } F(0,0);alert( "方案是:" + result+ "最大利润是:"+ maxValue ); </SCRIPT>