动态规划问题求解

nehc 2011-01-03 10:57:37
例题:某邮电局有四套通讯设备准备分给甲、乙、丙三个地区,事先调查了各地原有生产活动情况,在此基础上对各种分配方案的经济效益进行了估计,得表①的数据,例如甲区原有的生产活动的收益为38万元,当新增加一套通讯设备时总收益为41万元,其他类推.试求这四套设备的分配方案,使三地区总利益最大.

以下为通讯设备在不同地区的收益(万元)
设备数/套 甲收益 乙收益 丙收益
0 38 40 48
1 41 42 64
2 48 50 68
3 60 60 78
4 66 66 76

我用穷举法为什么结果不对? 我的结果是156 ,正确结果应该是164

#include <stdio.h>
int main(void) {
int total = 4; //设备总数
int sum[3] = { 0 }; //分配方案
int best[3] = { 0 }; //最佳分配方案
int maxFound = 0, temp; //收益
int i, j, k;
for (i = 0; i <= total; i++) { //甲地区
switch (i) {
case 0:
sum[0] = 38;
break;
case 1:
sum[0] = 41;
break;
case 2:
sum[0] = 48;
break;
case 3:
sum[0] = 60;
break;
case 4:
sum[0] = 66;
break;
}
for (j = 0; j < total - i; j++) { //乙地区
switch (j) {
case 0:
sum[1] = 40;
break;
case 1:
sum[1] = 42;
break;
case 2:
sum[1] = 50;
break;
case 3:
sum[1] = 60;
break;
case 4:
sum[1] = 66;
break;
}
for (k = 0; k < total - i - j; k++) { //丙地区
switch (k) {
case 0:
sum[2] = 48;
break;
case 1:
sum[2] = 64;
break;
case 2:
sum[2] = 68;
break;
case 3:
sum[2] = 78;
break;
case 4:
sum[2] = 76;
break;
}
temp = sum[0] + sum[1] + sum[2];
if (temp > maxFound) {
maxFound = temp;
best[0] = sum[0];
best[1] = sum[1];
best[2] = sum[2];
}
}
}
}
printf("分配方案如下:%d,%d,%d\n",best[0],best[1],best[2]);
printf("总收益:%d", maxFound);
return 1;
}






PS还有个问题:我的穷举法也得不到正确结果 !!!
某奶牛站希望通过投资来扩大牛群数,开始只有5000元资金。现已知可购入A或B两个品种的奶牛,对A种牛每投资1000元,当年及以后每年可获得500元和2头小牛;对B种牛每投资1000元,当年及以后每年可获得200元和3头小牛。
问:(1)在今后四年内,应如何分配投资使牛群最大;
(2)到第四年底牛站将有多少头奶牛。


...全文
294 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ciborg 2011-01-06
  • 打赏
  • 举报
回复
动态规划其实和递归差不多

不同的是把递归中重复计算省略了!

ciborg 2011-01-06
  • 打赏
  • 举报
回复
我这有个第二个题的


#include <stdio.h>//穷举法求解
int main(void) {
int f1 = 5000,f2,f3,f4;
int max =0,temp = 0; // 牛的数量
int ff[4],tf[4];
int i,j,k,l;
for(i=0; i<=f1; i+=1000) // 第一年投资
{
temp += i*0.002 + (f1-i)*0.003; //小牛数量
f2 = 0.2*f1 + 0.3*i; // 收入
for(j=0; j<=f2; j+=1000) //第二年投资
{
temp += j*0.002 + (f2-j)*0.003;//小牛数量
f3 = 0.2*(f2/1000)*1000 + 0.3*j + f2;//收入
for(k=0; k<=f3; k+=1000) //第三年投资
{
temp += k*0.002 + (f3-k)*0.003;//小牛数量
f4 = 0.2*(f3/1000)*1000 + 0.3*k + f3; //收入
for(l=0; l<=f4; l+=1000) //第四年投资
{
temp += l*0.002 + (f4-l)*0.003;//小牛数量
if(temp > max)
{
max = temp;
ff[0] = i;tf[0]=f1;
ff[1] = j;tf[1]=f2;
ff[2] = k;tf[2]=f3;
ff[3] = l;tf[3]=f4;
}
temp = 0;
}
}
}
}
printf("第1年投资A种牛: %5d B种牛: %d\n",ff[0],tf[0]-ff[0]);
printf("第2年投资A种牛: %5d B种牛: %d\n",ff[1],tf[1]-ff[1]);
printf("第3年投资A种牛: %5d B种牛: %d\n",ff[2],tf[2]-ff[2]);
printf("第4年投资A种牛: %5d B种牛: %d\n",ff[3],tf[3]-ff[3]);
printf("四年后牛群牛数: %d \n",max);
return 0;
}

nehc 2011-01-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 cenziboy 的回复:]

for (j = 0; j < total - i; j++) { //乙地区
....
for (k = 0; k < total - i - j; k++) { //丙地区

[/Quote]

知道我的穷举错在哪了 !! 一下两处应该是 <=

for (j = 0; j <= total - i; j++) { //乙地区
....
for (k = 0; k <= total - i - j; k++) { //丙地区


谁给我个 动态规划算法呀 ??
nehc 2011-01-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 cenziboy 的回复:]
以下为通讯设备在不同地区的收益(万元)
设备数/套 甲收益 乙收益 丙收益
0 38 40 48
1 41 42 64
2 48 50 68
3 60 60 78
4 66 66 76

[/Quote]

显示出了点问题 !
设备数/套 甲收益 乙收益 丙收益
0 38 40 48
1 41 42 64
2 48 50 68
3 60 60 78
4 66 66 76

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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