Java语言之动态规划实现01背包

自己写的,代码直接可用。
package knapsack;

public class Knapsack_DynamicProgramming {

	/*
	 * 使用动态规划实现01背包问题 
	 */
	/**有4件物品*/
	static final int n=4;
	/**背包最大承重为9*/
	static int maxWeight=9;
	public static void main(String[] args) {
		
		int weight[]={0,2,3,4,5};//4件物品的重量
		int value[]={0,3,4,5,7};//4件物品的价值
		int values[][]=new int[n+1][maxWeight+1];//存放当前子结构中的最优价值,用于输出
		
		for(int i=0;i<=maxWeight;i++)
			values[0][i]=0;//第0行全为0
		for(int i=0;i<=n;i++)
			values[i][0]=0;//第0列全为0
		
		for(int i=1;i<=n;i++){
			for(int j=1;j<=maxWeight;j++){
				if(j<weight[i])
					values[i][j]=values[i-1][j];//如果物品i的重量超过背包可放重量,将他上面的数即目前最优装载数写入
				else{//可以将物品i放入背包,需要从【目前最优】和【之前最优并加入当前物品】取大
					values[i][j]=Math.max(values[i-1][j], values[i-1][j-weight[i]]+value[i]);
				}
				System.out.print(values[i][j]+"   ");
			}
			System.out.println();
		}
		
		System.out.println();
		System.out.print("最优值为"+values[n][maxWeight]+",最优装载为   ");
		for(int i=n;i>0;i--){
			if(values[i][maxWeight]>values[i-1][maxWeight]){
				System.out.print("第"+i+"件    ");
				maxWeight-=weight[i];
			}
		}
		System.out.print("物品。");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值