01背包参考:https://www.cnblogs.com/kkbill/p/12081172.html
二维数组:(java)
public class bag01 {
public static void main(String[] args) {
int v[]={1500,3000,2000};//价值
int w[]={1,4,3};//重量
int bag_size =4;//背包大小
//dp数组保存不同的记录
int dp[][]=new int[v.length+1][bag_size +1];
int lx=dp.length,ly=dp[0].length;
for(int i=1;i<lx;i++){
for(int j=1;j<ly;j++){
if(w[i-1]<=j){
dp[i][j]=Math.max(v[i-1]+dp[i-1][j-w[i-1]],dp[i-1][j]);
}else{
dp[i][j]=dp[i-1][j];
}
}
}
for (int i = 0; i < lx; i++) {
System.out.println(Arrays.toString(dp[i]));
}
}
}
优化为一维数组:
int v[]={1500,3000,2000};//价值
int w[]={1,4,3};//重量
int bag_size =4;//背包大小
int dp[]=new int[bag_size+1];
for (int i = 0; i < v.length; i++) {
for (int j = bag_size; j >=w[i] ; j--) {
dp[j]=Math.max(dp[j],dp[j-w[i]]+v[i]);
}
System.out.println(Arrays.toString(dp));
}