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("物品。");
	}
}

猜你喜欢

转载自blog.csdn.net/BaiFeng303/article/details/41219929