此题目有一个博主写的非常好,有需要去网友可以去看看:(29条消息) 动态规划 资源分配问题 代码超详细注释!!!_Stupid坨的博客-CSDN博客https://blog.csdn.net/weixin_44916213/article/details/1123197951.题目:资源分配问题:例如现在有A、B、C三个项目,利润表如下,有8万元的资金,求最大利润的资源分配方案。
2.设计思路:数组temp记录当前最大的收益情况;首先计算出第一个项目的利润表,在资金不断加大的情况下,根据第一个利润表去更新利润表,比如B项目的分配方案:i个资源,分配j个B的利润为temp[i-j](前i-j个资源的最大利润)+B获得j个资源时的利润;并且使用gain数组去记录每一个项目最优投资数。
3.代码:
/*资源分配问题*/
#include <stdio.h>
#define N 7
#define M 3
float profit[M+1][N+1]; //存储不同资源分配方案下的利润
float test[24]={0,0.11,0.13,0.15,0.21,0.24,0.3,0.35,
0,0.12,0.16,0.21,0.23,0.25,0.24,0.34,
0,0.08,0.12,0.2,0.24,0.25,0.3,0.35};
int main()
{
float temp[N+1]; //当前正在计算的最大利润
float f[N+1]; //当前的最大利润
int a[M+1][N+1]; //资源分配表,包括分配为0的情况
int gain[M];
int number=0;
for(int i=0;i<=M;i++) //给初始的利润表profit赋值
{
for(int j=0;j<=N;j++)
{
profit[i][j]=test[number++];
if(i<1)
{
//printf("profit=%3.2f\n",profit[i][j]);
a[1][j]=j; //第一个项目的资源分配
f[j]=profit[0][j];
temp[j]=profit[0][j]; //只有一个项目时把能用的资源赋值给此项目时利润最大
//printf("sum1=%3.2f\n",temp[j]);
}
}
}
int layer=0;
//printf("sum2=%3.2f\n",temp[3]);
for(int k=2;k<=M;k++) //依次加入新项目
{
//printf("layer=%d\n",layer);
layer++;
for(int i=0;i<=N;i++) //不同资源数量的分配方案
{
for(int j=0;j<=i;j++) //分配给新项目的资源数
{
if(profit[layer][j]+temp[i-j]>f[i]) //分配给新项目j个资源和全部资源数i分配给之前项目的利润比较
{
f[i]= profit[layer][j]+temp[i-j];
a[k][i]=j;
//printf("j=%d\n",a[k][i]=j);
printf("sum3=%3.2f\n",f[i]);
}
}
}
for(int j=0;j<= N;j++)
{
temp[j]=f[j]; //记录已算的项目资源分配利益总表
}
printf("第一次结束:\n");
}
int rest=N;
for(int i=M;i>=1;i--) //记录每个项目的资源分配情况
{
gain[i] = a[i][rest]; //i项目当整体取得最大利益时分配的资源数
rest = rest - gain[i]; //剩余的资源数
}
//printf("layer1=%d\n",layer);
//printf("a[1][1]=%d\n",a[1][1]);
for(int i=1;i<=M;i++)
{
printf("第%d个项目投资%d万元\n",i,gain[i]);
}
printf("sum=%3.2f:\n",f[N]);
}
4.运行结果:
5.总结:资源分配的问题,搞了一下午才做出了0.0。因为一开始在使用了temp数组,temp数组在改变的时候,影响了中间的大小比较,所以一直出不来;总结下来,资源分配是需要多个表去记录之前已经计算的结果,需要的时候,直接拿出来调用;最优解的路径还是自底向上的寻找,从最大资源开始,在此处用掉一部分资源的条件下,往后去查找上一个的最优解,也就是a[i][rest],rset=n-gain[i];动态规划的题目还是不容易做,希望多多积累经验吧!