动态规划学习(2)

来源:互联网 发布:2016年双11数据分析 编辑:程序博客网 时间:2024/06/05 11:13

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

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