动态规划资源最优分配算法用C++实现

zx890205 2010-06-05 09:56:01
各位高手帮帮忙啊,谢谢!!!
...全文
876 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
android_newcomer 2011-12-14
  • 打赏
  • 举报
回复
话说用贪心法不知道效率咋样
超级大笨狼 2010-06-06
  • 打赏
  • 举报
回复
单纯型,初等变换,都忘记了
hellodota121 2010-06-06
  • 打赏
  • 举报
回复
mark!!!!
超级大笨狼 2010-06-05
  • 打赏
  • 举报
回复
你这个例子有问题,因为用眼睛都能看出来,把资源全部都给第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>

zx890205 2010-06-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 budtang 的回复:]
C/C++ code
#include<iostream>
using namespace std;

#define M 10 // 最多资源份量
#define N 10 // 最多工程数量

int g[M+1][N]; // 资源分配利润函数
int solve[N]; // 最优分配方案
int m, n; ……
[/Quote]
谢谢
zx890205 2010-06-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zx890205 的回复:]
引用 1 楼 superdullwolf 的回复:
没有instance,无法回答。


C/C++ code

//运输或资源分配类问题,其实很好理解,我们找张纸,先把数据按照这个格式抄下来

//最后一列是供应数,最后一行是需求数
2 1 3 2 60
1 3 2 1 40
3 4 1 1 50
20 35 33 34

//第……
我是想要代码,有没有代码
[/Quote]那我给你个例子,有8个份额的资源,分配给3个工程,其利润函数如下
x 0 1 2 3 4 5 6 7 8
G1(x) 0 4 26 40 45 50 51 52 53
G2(x) 0 5 15 40 60 70 73 74 75
G3(x) 0 5 15 40 80 90 95 98 100
求资源的最优分配方案
budweiser 2010-06-05
  • 打赏
  • 举报
回复
#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;
}



大致说明: 为第i个工程计算最优时,只需将分配若干给前i-1个工程、剩下的留给当前工程得到的各种分配方案,和只分配给当前工程的方案,取其中的最大值即可;而第一个工程解就是只分配给自身的解。
zx890205 2010-06-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 superdullwolf 的回复:]
没有instance,无法回答。


C/C++ code

//运输或资源分配类问题,其实很好理解,我们找张纸,先把数据按照这个格式抄下来

//最后一列是供应数,最后一行是需求数
2 1 3 2 60
1 3 2 1 40
3 4 1 1 50
20 35 33 34

//第……
[/Quote]我是想要代码,有没有代码
jakiejiajia 2010-06-05
  • 打赏
  • 举报
回复
友情顶一下
超级大笨狼 2010-06-05
  • 打赏
  • 举报
回复
没有instance,无法回答。


//运输或资源分配类问题,其实很好理解,我们找张纸,先把数据按照这个格式抄下来

//最后一列是供应数,最后一行是需求数
2 1 3 2 60
1 3 2 1 40
3 4 1 1 50
20 35 33 34

//第一步,找到价格是最低的,1块钱的
//第一行第二列,产是60,需是35,
//把60个产量,拿35个满足之;
//可以分配的产量就是25
//需求就是0了,表就变成了下边

2 1 3 2 [25]
1 3 2 1 40
3 4 1 1 50
20 [0] 33 34

//重复这个过程,直到产方全是0,或者供方全是0
//就完成了。

zx890205 2010-06-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 superdullwolf 的回复:]
那我给你个例子,有8个份额的资源,分配给3个工程,其利润函数如下
x 0 1 2 3 4 5 6 7 8
G1(x) 0 4 26 40 45 50 51 52 53
G2(x) 0 5 15 40 60 70 73 74 75
G3(x) 0 5 15 40 80 90 95 98 100
求资源的最优分配方案

你这个缺少约束条件吧,挑选最贵的3个就行了啊。
是不是缺少每个工程……
[/Quote]
不是啊。。这是算法书上的原题目
超级大笨狼 2010-06-05
  • 打赏
  • 举报
回复
那我给你个例子,有8个份额的资源,分配给3个工程,其利润函数如下
x 0 1 2 3 4 5 6 7 8
G1(x) 0 4 26 40 45 50 51 52 53
G2(x) 0 5 15 40 60 70 73 74 75
G3(x) 0 5 15 40 80 90 95 98 100
求资源的最优分配方案

你这个缺少约束条件吧,挑选最贵的3个就行了啊。
是不是缺少每个工程消耗的资源表啊。


陽洸膂珵 2010-06-05
  • 打赏
  • 举报
回复
友情顶一下
qq120848369 2010-06-05
  • 打赏
  • 举报
回复
貌似就是KM算法,自学去了.
qq120848369 2010-06-05
  • 打赏
  • 举报
回复
顺便打听一下,我想用网络流求最大费用流,就是权值最大匹配那种,应该怎么从最小费用最大流方法转化过去.

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧