0-1背包问题 #include <iostream> #include <vector> #include <string> #include <algorithm> #include <cmath> #define NUM 100 using namespace std; int KnapSack(int wei[], int val[], int capacity, int n){ // n是物品数量 int size = n; //int size = 4; if(size == 0) return 0; // 动态规划,填充记忆搜索数组 int dp[size][capacity]; // 初始化第一行 // //仅考虑容量为C的背包放第0个物品的情况 for (int i = 0; i <= capacity; i++) { dp[0][i] = wei[0] <= i ? val[0] : 0; } //填充其他行和列 for (int i = 1; i < size; i++) { for (int j = 0; j <= capacity; j++) { dp[i][j] = dp[i - 1][j]; // 先确定是前一次的结果 if (wei[i] <= j) { // 能放的下 dp[i][j] = max(dp[i][j], val[i] + dp[i - 1][j - wei[i]]); // 不选,或者选择,结果是这次的价值+上个物品但容量是j - w[i] } } } return dp[size - 1][capacity]; } int main(){ int w[] = {2, 1, 3, 2}; int v[] = {12, 10, 20, 15}; int n = sizeof(w) / sizeof(w[0]); cout << KnapSack(w, v, 5, n); }