美文网首页
01背包问题-HJ16 购物单

01背包问题-HJ16 购物单

作者: help_youself | 来源:发表于2022-07-14 14:03 被阅读0次

 牛客测试地址,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背包问题

相关文章

  • 01背包问题-HJ16 购物单

     牛客测试地址,01背包[https://www.nowcoder.com/practice/2820ea076d...

  • (python实现)购物单问题

    购物单问题实际上是0-1问题,在解决这个问题之前,要理解0-1背包问题。可以自己百度或者阅读我对0-1背包问题的理...

  • 动态规划-背包问题

    01背包问题 详解:01背包问题详解链接

  • 背包问题1(01背包)

    N件物品,没见有重量Wi,价值Vi;选其中几件放入容量为M的背包中,求价值的最值。——经典背包问题背包问题分三类:...

  • 01背包问题

    动态规划算法一般用来求解最优化问题,当问题有很多可行解,而题目要求寻找这些解当中的“最大值”/“最小值”时,通常可...

  • 01背包问题

    题目描述:给定 n 个物品和一个容量为 W 的背包,物品 i 的重量是 wi,其价值为 vi 。应该如何选择装入背...

  • 01背包问题

    有n个重量和价值分别为wi,vi的物品。从这些物体中挑选出总重量不超过W的物品,求所有方案中价值总和的最大值。 1...

  • 01背包问题

    A - Bone Collector Many years ago , in Teddy’s hometown t...

  • 01背包问题

    令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就j(1<=j<=C)的背包中的物品的最大价值,则...

  • 01背包问题

    题目:有A(2kg,6$);B(2kg,3$);C(6kg,5$);D(5kg,4$);E(4kg,6$)五种物品...

网友评论

      本文标题:01背包问题-HJ16 购物单

      本文链接:https://www.haomeiwen.com/subject/hdbxirtx.html