某企业每月给其A、B、C 和D 四个门店一共发送6 个集装箱的某种货物,如果各门店出售该种货物的利润(万元)如下表:

某企业每月给其A、B、C 和D 四个门店一共发送6 个集装箱的某种货物,如果各门店出售该种货物的利润(万元)如下表:
在这里插入图片描述
试求这6 箱货物如何分配给各门店,才能获得最大总利润。

解题思路:
将问题按卖场分为四个阶段,将A、B、C、D四个卖场分别编号为1、2、3、4。设:状态变量S:表示每月分配给第1个卖场至第4个卖场的货物吨数(k=1,2, 3,4)。
决策变量:表示每月分配给第1个卖场的货物吨数(k=1,2,3,4)。
状态转移方程为:Sk+1+Sk-Xk,即=Sk+1+Xk 。
已知S1=6,S4=X4。
dp(Sk):表示第k阶段的最佳总效果。
r(xk):表示第k阶段取得最佳效果时Xk的取值。

第一阶段
当K=1时
在这里插入图片描述
第二阶段
当K=2时
在这里插入图片描述
第三阶段
当K=3时
在这里插入图片描述
第四阶段
当K=4时
在这里插入图片描述

得到最优表开始逆推 依次取得4表中对应的最大值 r[3][6],r[2][5],r[1][2],r[0][2]
即最优解为A取2 B取2 C取1 D取1 即 6+4+3+4=17(万元)

public class liuzhuangSB {

	public static int[][] s = new int[][] {{0,4,6,7,7,7,7},{0,2,4,6,8,9,10},{0,3,5,7,8,8,8},{0,4,5,6,6,6,6}};
	
	//dp记录每次递推的最大值
	//r记录每次最大值的情况
	//0123行代表A AB ABC ABCD
	public static int[][] dp = new int[4][7];
	public static int[][] r  = new int[4][7];
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//将A赋值给最优情况
		for(int i = 0; i < dp[0].length; i++) {
			dp[0][i] = s[0][i];
			r[0][i] = i;
		}
		//依次对AB ABC ABCD进行递推 得到所有的最优情况表
		for(int z = 1; z < 4; z++) {
			for(int i = 0; i < dp[0].length; i++) {
				int[] temp = new int[7];
				for(int j = 0; j <= i; j++) {
					temp[j] = dp[z-1][i-j]+s[z][j];
					if(temp[j] > dp[z][i]) {
						dp[z][i] = temp[j];
						r[z][i] = j;
					}
				}
			}
		}
		
		//逆推
		int num = 6;
		int nums[] = new int[4];
		while(num!=0) {
			for(int i = 3; i >= 0; i--) {
				nums[i] = r[i][num];
				num -= nums[i];
			}
		}
		System.out.println("取A:"+nums[0]+"个 取B:"+nums[1]+"个 取C:"+nums[2]+"个 取D:"+nums[3]+"个");
	}
}
发布了68 篇原创文章 · 获赞 148 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_43274298/article/details/102996483