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里面的条件我都改过了。
递归最后一定要返回个东西。不过好像也没啥可改的了。
原文:https://www.cnblogs.com/beiyueya/p/12132718.html