动态规划之资源分配

此题目有一个博主写的非常好,有需要去网友可以去看看:(29条消息) 动态规划 资源分配问题 代码超详细注释!!!_Stupid坨的博客-CSDN博客icon-default.png?t=LA46https://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];动态规划的题目还是不容易做,希望多多积累经验吧!

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值