背包1 常用、常见
常用、常见
代码片
.
public static void pakege(int [] w,int []v,int maxw)
{
// int[] w = {3,5,2,6,4};//物品重量
// int[] v = {4,4,3,5,3};//物品价值
// int maxw = 12;//背包容量
int len = v.length;//物品个数
int[][] f = new int[len+1][maxw+1];
int i,j;
for(i = 1; i < f.length; i++)
{
for(j = 1; j < f[0].length; j++)
{
if(w[i-1] > j)
f[i][j] = f[i-1][j];
else {
if(f[i-1][j] < f[i-1][j-w[i-1]] + v[i-1])
{
f[i][j] = f[i-1][j-w[i-1]] + v[i-1];
}
else {
f[i][j] = f[i-1][j];
}
}
}
}
for(i = 0; i < f.length; i++)
{
for(j = 0; j < f[0].length; j++)
System.out.print(f[i][j] + " ");
System.out.println();
}
}
输出
.
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 4 4 4 4 4 4 4 4 4 4
0 0 0 4 4 4 4 4 8 8 8 8 8
0 0 3 4 4 7 7 7 8 8 11 11 11
0 0 3 4 4 7 7 7 8 9 11 12 12
0 0 3 4 4 7 7 7 8 10 11 12 12
背包2 要求给出是哪几个物品放入其中
如果题目要求给出是哪几个物品放入其中,则我们在代码里面加入一个标记数组:
代码片
.
public static void pakege2(int [] weight,int []val,int m) {
// int[] weight = {3,5,2,6,4}; //物品重量
// int[] val = {4,4,3,5,3}; //物品价值
// int m = 12; //背包容量
int n = val.length; //物品个数
int[][] f = new int[n+1][m+1]; //f[i][j]表示前i个物品能装入容量为j的背包中的最大价值
int[][] path = new int[n+1][m+1];
//初始化第一列和第一行
for(int i=0;i<f.length;i++){
f[i][0] = 0;
}
for(int i=0;i<f[0].length;i++){
f[0][i] = 0;
}
//通过公式迭代计算
for(int i=1;i<f.length;i++){
for(int j=1;j<f[0].length;j++){
if(weight[i-1]>j)
f[i][j] = f[i-1][j];
else{
if(f[i-1][j]<f[i-1][j-weight[i-1]]+val[i-1]){
f[i][j] = f[i-1][j-weight[i-1]]+val[i-1];
path[i][j] = 1;
}else{
f[i][j] = f[i-1][j];
}
//f[i][j] = Math.max(f[i-1][j], f[i-1][j-weight[i-1]]+val[i-1]);
}
}
}
for(int i=0;i<f.length;i++){
for(int j=0;j<f[0].length;j++){
System.out.print(f[i][j]+" ");
}
System.out.println();
}
int i=f.length-1;
int j=f[0].length-1;
while(i>0&&j>0){
if(path[i][j] == 1){
System.out.print("第"+i+"个物品装入 ");
j -= weight[i-1];
}
i--;
}
}
输出
.
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 4 4 4 4 4 4 4 4 4 4
0 0 0 4 4 4 4 4 8 8 8 8 8
0 0 3 4 4 7 7 7 8 8 11 11 11
0 0 3 4 4 7 7 7 8 9 11 12 12
0 0 3 4 4 7 7 7 8 10 11 12 12
第4个物品装入 第3个物品装入 第1个物品装入
背包3 一维数组(装满) 装满
一维数组(装满) 装满
代码片
.
public static void pakege3(int [] w,int []v,int maxw) {
// int[] w = {3,5,2,6,4};
// int[] v = {4,4,3,5,3};
// int maxw = 3;
int[] f = new int[maxw+1];
int i,j;
for(i = 1; i < f.length; i++)
f[i] = Integer.MIN_VALUE;
for(i = 0; i < v.length; i++)
for(j = f.length - 1; j >= w[i]; j--)
f[j] = f[j] > (f[j-w[i]] + v[i]) ? f[j] : (f[j-w[i]] + v[i]);
//f[j] = Math.max(f[j], f[j-w[i]] + v[i]);
for(i = 0; i < f.length; i++)
System.out.print(f[i] + " ");
}
输出
.
0 -2147483648 3 4
背包4 不装满
不装满
代码片
.
public static void pakege4(int [] w,int []v,int maxw){
//int[] w = {3,5,2,6,4};//物品重量
//int[] v = {4,4,3,5,3};//物品价值
//int maxw = 12;
int[] f = new int[maxw+1];
int i,j;
for(i = 0; i < f.length; i++)
f[i] = 0;
for(i = 0; i < v.length; i++)
{
for(j = f.length - 1; j >= w[i]; j--)
{
//f[j] = f[j] > (f[j-w[i]] + v[i]) ? f[j] : (f[j-w[i]] + v[i]);
f[j] = Math.max(f[j], f[j-w[i]] + v[i]);
}
}
for(i = 0; i < f.length; i++)
System.out.print(f[i] + " ");
System.out.println();
}
输出
:
0 0 3 4 4 7 7 7 8 10 11 12 12
背包5 双约束
体积约束、质量约束
代码
.
public class Main {
public static int pakage5 (int numberOfRadLiquid, int reactorCap, int criticalMass,
int []volumes, int []masses, int []energies) {
// int numberOfRadLiquid=5;//小瓶数量
// int reactorCap=100; //总体积
// int criticalMass=15; //最大质量
// int []volumes= {50,40,30,20,10};// maight //每小瓶体积
// int []masses= {1,2,3,9,5};//每小瓶质量
// int []energies= {300,480,270,200,180}; // value 每小瓶能量
// 双约束
int[][][] dp=new int[numberOfRadLiquid+1][reactorCap+1][criticalMass+1];
for(int i=1;i<numberOfRadLiquid+1;i++) { //总个数(已知的)
for(int j=1;j<reactorCap+1;j++) { //限制条件01
for(int k=1;k<criticalMass+1;k++) { //限制条件02
if(j<volumes[i-1]||k<masses[i-1]) {
dp[i][j][k]=dp[i-1][j][k];
}else{
dp[i][j][k]=Math.max(dp[i-1][j][k], dp[i-1][j-volumes[i-1]][k-masses[i-1]]+energies[i-1]);
}
}
}
}
return dp[numberOfRadLiquid][reactorCap][criticalMass];
}
public static void main(String args[]) {
int numberOfRadLiquid=5;
int reactorCap=100;
int criticalMass=15;
int []volumes= {50,40,30,20,10};// maight
int []masses= {1,2,3,9,5};
int []energies= {300,480,270,200,180}; // value
System.out.println(
pakage5( numberOfRadLiquid,reactorCap,criticalMass, volumes,masses, energies)
);
}
}
输出
.
960