码迷,mamicode.com
首页 > 其他好文 > 详细

01背包问题(动态规划)

时间:2019-03-23 22:51:03      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:.com   http   else   class   names   display   highlight   超过   closed   

描述:
n个重量价值为wi,vi的物品,从这些物品中挑出重量不超过w的物品,求挑选方案中价值和最大值
1=<n<=100
1=<wi,vi<=100
1=<=W<=10000
输入:4
2 3 1 2 3 4 2 2
5
输出:
7
技术图片
#include<iostream>
using namespace std;
int const maxn=1000;
int n,W;
int w[maxn],v[maxn];
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()
{
    cin>>n;
    int i;
    for(i=0;i<n;i++)  cin>>w[i]>>v[i];
    cin>>W;
//    rec(0,W);
    cout<<     rec(0,W)<<endl;
} 
View Code

优化后的代码:dp[][] 记录选还是不选时候的状态

技术图片
//记忆化数组,优化 
#include<iostream>
using namespace std;
int const maxn=1000;
int n,W;
int w[maxn],v[maxn];
int dp[maxn][maxn]; 
int rec(int i,int j){
    if(dp[i][j]) 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()
{
    cin>>n;
    int i;
    for(i=0;i<n;i++)  cin>>w[i]>>v[i];
    cin>>W;
//    rec(0,W);
    cout<<     rec(0,W)<<endl;
} 
View Code

技术图片

 

01背包问题(动态规划)

标签:.com   http   else   class   names   display   highlight   超过   closed   

原文地址:https://www.cnblogs.com/helloworld2019/p/10585798.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!