01背包问题-HJ16 购物单

 牛客测试地址,01背包
 1 动态规划

class Solution{
public:
    int knapsack(int V, int n, vector<vector<int> >& vw) {
        // write code here
        int dp[n+1][V+1];
        for(int i=0;i<=n;i++){
            for(int j=0;j<=V;j++){
                dp[i][j]=0;
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=V;j++){
                int space=vw.at(i-1).at(0);
                int w=vw.at(i-1).at(1);
                if(j>=space){
                    dp[i][j]=max(dp[i-1][j],dp[i-1][j-space]+w);
                }else{
                   dp[i][j]=dp[i-1][j];
                }
            }
        }
        return dp[n][V];
    }
};

 另外一个实例,HJ16 购物单

#include<iostream>
#include<math.h>
#include <vector>
#include <map>
#include <array>
using namespace std;
struct Good{
    Good():price(0),utility(0){}
    Good(int a,int b):price(a),utility(b){}
    int num=0;
    int price;
    int utility;
};
void configTest(int &N,int &m,std::vector<std::array<Good,4> >& goods,int factor=10){
    N=1000/factor;
    m=5;
    goods.resize(m);
    std::vector<std::vector<int>> vpq;
    vpq.push_back({800,2,0});
    vpq.push_back({400,5,1});
    vpq.push_back({300,5,1});
    vpq.push_back({400,3,0});
    vpq.push_back({500,2,0});
    for(int i=0;i<vpq.size();i++){
        int price=vpq.at(i).at(0)/factor;
        int weight=vpq.at(i).at(1);
        int index=i;
        int j=0;
        if(0!=vpq.at(i).at(2)){
            index=vpq.at(i).at(2)-1;
            j=1;
            if(1==goods[index].at(j).num){
                j=2;
            }
        }
        goods[index].at(j).num=1;
        goods[index].at(j).price=price;
        goods[index].at(j).utility=(price*weight);
    }
}
static inline int getArrsize(std::array<Good,4>&arr){
    int ret=0;
    if(0==arr.at(0).num){
        ret=0;
    }else if(0==arr.at(1).num){
        ret=1;
    }else if(0==arr.at(2).num){
        ret=2;
    }else if(0==arr.at(3).num){
        ret=3;
    }else{
        ret=4;
    }
    return ret;
}
void processData(std::vector<std::array<Good,4> > &goods){
    std::vector<std::array<Good,4> > buffer;
    int n=goods.size();
    for(int i=0;i<n;i++){
        int sz=getArrsize(goods.at(i));
        if(sz>0){
            buffer.push_back(goods.at(i));
        }
    }
    goods.swap(buffer);
}
int main(){
    int N,m;
    int factor=10;
    std::vector<std::array<Good,4> > goods;
    //configTest(N,m,goods);
    {
        std::cin>>N;
        std::cin>>m;
        goods.resize(m);
        N/=factor;
        int v,p,q;
        for(int i=0;i<m;i++){
            std::cin>>v;
            std::cin>>p;
            std::cin>>q;
            int index=i;
            int j=0;
            if(q!=0){
                index=q-1;
                j=1;
                if(0!=goods.at(index).at(j).num){
                    j=2;
                }
            }
            goods.at(index).at(j).num=1;
            int price=v/factor;
            goods.at(index).at(j).price=price;
            goods.at(index).at(j).utility=price*p;
        }
    }
    processData(goods);
    int all=goods.size();
    int dp[all+1][N+1];
    for(int i=0;i<=all;i++){
        for(int j=0;j<=N;j++){
            dp[i][j]=0;
        }
    }
    for(int i=1;i<=all;i++){
        for(int j=1;j<=N;j++){
            int buy=0;
            int sz=getArrsize(goods.at(i-1));
            int max_u=dp[i-1][j];
            if(1==sz){
                buy=0;
                int a=goods.at(i-1).at(buy).price;
                int b=goods.at(i-1).at(buy).utility;
                if(j>=a){
                   max_u=max(max_u,dp[i-1][j-a]+b);
                }
            }else if(2==sz){
                buy=0;
                int a=goods.at(i-1).at(buy).price;
                int b=goods.at(i-1).at(buy).utility;
                buy=1;
                int c=goods.at(i-1).at(buy).price;
                int d=goods.at(i-1).at(buy).utility;
                if(j>=a){
                    max_u=max(max_u,dp[i-1][j-a]+b);
                }
                if(j>=a+c){
                    max_u=max(max_u,dp[i-1][j-a-c]+b+d);
                }
            }else if(3==sz){
                buy=0;
                int a=goods.at(i-1).at(buy).price;
                int b=goods.at(i-1).at(buy).utility;
                buy=1;
                int c=goods.at(i-1).at(buy).price;
                int d=goods.at(i-1).at(buy).utility;
                buy=2;
                int e=goods.at(i-1).at(buy).price;
                int f=goods.at(i-1).at(buy).utility;
                if(j>=a){
                    max_u=max(max_u,dp[i-1][j-a]+b);
                }
                if(j>=a+c){
                    max_u=max(max_u,dp[i-1][j-a-c]+b+d);
                }
                if(j>=a+e){
                    max_u=max(max_u,dp[i-1][j-a-e]+b+f);
                }
                if(j>=a+c+e){
                    max_u=max(max_u,dp[i-1][j-a-c-e]+b+d+f);
                }
            }
            dp[i][j]=max_u;
        }
    }
    std::cout<<factor*dp[all][N];
}

Reference:
[1] 算法分享之01背包问题
[2]动态规划---01背包问题详解
[3]动态规划:01背包问题

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容