java 动态规划 01背包 矩阵连乘

java 动态规划 01背包 矩阵连乘

package sf;

import java.util.Arrays;
import java.util.Scanner;

//实验四,动态规划,0/1背包
public class knap {
	
public static void Knap(int v[], int w[], int c, int n, int m[][]) {
		/* v是价值向量,w是质量向量,c是背包容量,n物品数量,m是最价值矩阵*/
	
		int jMax = Math.min(w[n] - 1, c);   	
		//对二维数组初始化
		for (int j = 0; j <= jMax; j++)       
			m[n][j] = 0;
		for (int j = w[n]; j <= c; j++)        
			m[n][j] = v[n];                   
		for (int i = n - 1; i > 1; i--) {   
			jMax = Math.min(w[i] - 1, c);           // 先确定 0<= j <w[i]时的m[i][j]
			for (int j = 0; j <= jMax; j++)
				m[i][j] = m[i + 1][j];
			for (int j = w[i]; j <= c; j++)  
				m[i][j] = Math.max(m[i + 1][j], m[i + 1][j - w[i]] + v[i]);
		}
		m[1][c] = m[2][c];                     //w[1]>c时的m[1][j]
		if (c >= w[1])                         //c>=w[1]时的m[1][j]
			m[1][c] = Math.max(m[1][c], m[2][c - w[1]] + v[1]);
	}
static void Traceback(int m[][], int w[], int c, int n, int x[]) {
	for (int i = 1; i < n; ++i) {
		if (m[i][c] == m[i + 1][c])
			x[i] = 0;
		else {
			x[i] = 1;
			c -= w[i];
		}
	}
	
	//m[n][c]不为0,x[n]赋值1,为0,赋值0
	if(m[n][c]>1) {
		x[n] =1;
	}
	if(m[n][c]==0) {
		x[n] =0;
	}
	     
}
public static void main(String[] args) {
	int []w=new int[101];
	int []v=new int[101];
	int []x=new int[6];
	int [][]m=new int[101][101];
	Scanner sc=new Scanner(System.in);
	System.out.println("输入背包容量:");
	int c=sc.nextInt();

	System.out.println("输入物品数量:");
	w[0]=sc.nextInt();
	v[0]=w[0];
	
	System.out.println("输入各物质量:");
	for (int i = 1; i <= w[0]; ++i) {
		w[i]=sc.nextInt();
	}
	
	System.out.println("输入各物品价值:");
	for (int i = 1; i <= w[0]; ++i) {
		v[i]=sc.nextInt();
	}
	
	Knap(v, w, c, w[0], m);
	Traceback(m, w, c, w[0], x);
	
	//System.out.println(Arrays.toString(x));
	System.out.println("选中的物品为1,未选中的为0:");
	for (int i = 1; i <= w[0]; ++i) {
		System.out.print(x[i]+" ");
	}
	System.out.println();
	System.out.println("总价值为:");
    System.out.println(m[1][c]);

}}


矩阵连乘
请添加图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值