0/1背包问题 递归思想+备忘录 好理解

#include <bits/stdc++.h>
using namespace std;

int memo[1000][1000]={0};

int knapSack(int weight[],int value[],int index,int capacity){ 
    if(index<=0 || capacity<=0) return 0;
    
    if(memo[index][capacity] !=0){
        return memo[index][capacity];
    }
    
    // 不包含第index个物品所得的价值 
    int res = knapSack(weight,value,index-1,capacity); 
    // 包含第index个物品所得的价值
    if(weight[index]<=capacity)
    {
    res = max(res,value[index]+knapSack(weight,value,index-1,capacity-weight[index])); 
    }
    
    //添加子问题的解,便于下次直接使用
    memo[index][capacity] = res;
    return res;
}

int main(){
    int n,c;   // 第一行为n值和c值,表示n件物品和背包容量c
    cin>>n>>c;
    int weight[1000];
    int value[1000];
    
    for(int i=1;i<=n;i++){  //每行有两个数据,分别表示第i(1≤i≤n)件物品的重量和价值。
        cin>>weight[i]>>value[i];
    }
    
    cout<<knapSack(weight,value,n,c)<<endl;
} 
原文地址:https://www.cnblogs.com/lvjingyuan/p/13954107.html