首页 > 其他 > 详细

01背包问题(动态规划)

时间:2019-03-23 22:30:11      阅读:169      评论:0      收藏:0      [点我收藏+]
描述:
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背包问题(动态规划)

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

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