背包问题c++动态规划方式
2021年12月1日更新 java
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算01背包问题的结果
* @param V int整型 背包的体积
* @param n int整型 物品的个数
* @param vw int整型二维数组 第一维度为n,第二维度为2的二维数组,vw[i][0],vw[i][1]分别描述i+1个物品的vi,wi
* @return int整型
*/
public int knapsack (int V, int n, int[][] vw) {
int[] maxV = new int[V+1];
for(int j=V;j>=0;j--) {
maxV[j] = 0;
}
for(int i=0;i<n;i++) {
for(int j=V;j>=vw[i][0];j--) {
if (maxV[j] < vw[i][1] + maxV[j-vw[i][0]]) {
maxV[j] = maxV[j-vw[i][0]] + vw[i][1];
}
}
}
return maxV[V];
}
}
#include <iostream>
using namespace std;
int weight[5] = {5,2,4,8,6};
int len[5] = {2,4,3,1,7};
int num = 5;
int space = 15;
int main() {
int max_weight[15] = {0};
for(uint32_t i=0; i<num;i++) {
for(uint32_t j=space; j>len[i]; j--) {
if (max_weight[j-len[i]] + weight[i] > max_weight[j]) {
max_weight[j] = max_weight[j-len[i]] + weight[i];
}
}
for(uint32_t j=0; j<space; j++) {
cout<<max_weight[j]<<" ";
}
cout<<endl;
}
cout<<max_weight[14]<<endl;
return 0;
}
结果
0 0 0 5 5 5 5 5 5 5 5 5 5 5 5 0 0 0 5 5 5 5 7 7 7 7 7 7 7 7 0 0 0 5 5 5 9 9 9 9 11 11 11 11 11 0 0 8 8 13 13 13 17 17 17 17 19 19 19 19 0 0 8 8 13 13 13 17 17 17 17 19 19 19 23 23