首页 > 其他 > 详细

01背包问题

时间:2020-01-02 14:40:29      阅读:69      评论:0      收藏:0      [点我收藏+]

1,从朴素的方法开始。。

2,第0第1,,嗯看你定义喽。。

#include<iostream>
using namespace std;
const int manx=1005;
int n,wei,w[1005],v[1005];
int rec(int i,int j)
{//从第i个物品开始挑选,同时当前可承受的重量为j 
    int res;
    if(i==n)
    {
        res=0;
    }
    else if(j<w[i])
    {
        res=rec(i+1,j);
    } 
    else 
    {
        res=max(rec(i+1,j),rec(i+1,j-w[i])+v[i]);
    }
    return res;
 } 
int main(){
    cin>>n;
    for(int i=0;i<n;i++){cin>>w[i];cin>>v[i];}
    cin>>wei;
    cout<<rec(0,wei);
}

3,朴素的有点像递归里面的选数。就是多了点边界条件。

if else啥的。。得拓展一下。

if(i==n){return 0;
    }
    else if(j<w[i]){res=f(i+1,j);
    }
    else{res=max(f(i+1,j),f(i+1,j-w[i])+v[i]);
    }

应该是第三个以后的选择只能用else了。应该是规范。

4,费大的话,我看题目觉得呢,有点像附加限制条件的贪心。代码呢,像有边界的选数。(核心就是啊,除了一个i==n和j<w[i]的两个边界条件,

就是一个选数,选和不选。然后用了递归的形式。和这个三个选择只能选其一的东西。

费小的话,i==n里面的条件我都改过了。

递归最后一定要返回个东西。不过好像也没啥可改的了。

01背包问题

原文:https://www.cnblogs.com/beiyueya/p/12132718.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!