动态规划学习(1)

来源:互联网 发布:触摸屏软件开发公司 编辑:程序博客网 时间:2024/06/15 06:12

(1)有n个重量和价值分为w(i),v(i)的物品。从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。
*限制条件:1<=n<=100
1<=w(i),v(i)<=100
1<=W<=10000
(2)时间复杂度:O(2^n);
(3)总结:下面代码为01背包中最朴素的方法复杂度为O(2^n),当n很大时此代码肯定不能通过。
(4)测试数据:Sample input:首行为物品的个数n和目标价值W,紧随其后有两行,第一行为物品的重量,第二行为其价值。
Sample output:输出挑选的价值总和的最大值。
4 5
2 1 3 2
3 2 4 2

(5)代码:

#include<iostream>using namespace std;const int MAX_N=1e2+6;int w[MAX_N],v[MAX_N],n,W;int rec(int i,int 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(){    ios::sync_with_stdio(false);cin.tie(0);    cin>>n>>W;    for(int i=0;i<n;i++)cin>>w[i];    for(int i=0;i<n;i++)cin>>v[i];    cout<<rec(0,W)<<endl;}
原创粉丝点击