题解 | #购物单#

购物单

https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4?tpId=37&tqId=21239&rp=1&ru=%2Fexam%2Foj%2Fta&qru=%2Fexam%2Foj%2Fta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=&dayCountBigMember=%E8%BF%9E%E7%BB%AD%E5%8C%85%E6%9C%88

#include <iostream>
#include <algorithm>
using namespace std;

//0-1背包问题
int main() {
    int N, m;    //m个商品,附件绑定主件
    int weight[60][3] = {0};   //3中情况:主件,附件1,附件2,weight是v
    int value[60][3] = {0};    //value是p
    if(cin>>N>>m){
        int dp[60][32000] = {0};
        // N /= 10;   //都是10的整数倍 节约空间
        int v,p,q;
        for(int i=1;i<=m;i++){
            cin>>v>>p>>q;   
            p = p*v;
            // v /= 10;
            //按主件-附件分类  第二个小标表示是第i件物品还是主件附件
            if(q == 0){    //仅主件
                weight[i][q] = v;
                value[i][q] = p;
            }
            else if(weight[q][1]==0){     //指针指向商品q,第二个角标1表示主件的附件1
                weight[q][1] = v;
                value[q][1] = p;
            }
            else{
                weight[q][2] = v;
                value[q][2] = p;
            }
        }

        //动态规划,dp[i][j]表示前i个商品,预算为j的情况下,能得到的最大满意度
        for(int i=1;i<=m;i++){
            for(int j=1;j<=N;j++){
                int max_i = dp[i-1][j];
                //遍历每种情况
                if(weight[i][0] <= j){  //第一种情况,只有主件
                    max_i = max(max_i, dp[i-1][j-weight[i][0]] + value[i][0]);
                    // if(t > dp[i-1][j])
                    // dp[i][j] = max_i;  
                }
                if(weight[i][0] + weight[i][1] <= j){   //第二种情况,有主件+附件1
                    max_i = max(max_i, dp[i-1][j-weight[i][0]-weight[i][1]] + value[i][0] + value[i][1]);
                    // if(t > dp[i-1][j])
                    // dp[i][j] = max_i;
                }
                if(weight[i][0] + weight[i][2] <= j){    //第三种情况,有主件+附件2
                    max_i = max(max_i, dp[i-1][j-weight[i][0]-weight[i][2]] + value[i][0] + value[i][2]);
                    // if(t > dp[i-1][j])
                    // dp[i][j] = max_i;
                }
                if(weight[i][0] + weight[i][1] +weight[i][2] <= j){    //第四种情况,有主件+附件1+附件2
                    max_i = max(max_i, dp[i-1][j-weight[i][0]-weight[i][1]-weight[i][2]] + value[i][0] + value[i][1] + value[i][2]);
                    // if(t > dp[i-1][j])
                    // dp[i][j] = max_i;
                }
                dp[i][j] = max_i;
            }

            
        }
        cout<<dp[m][N]<<endl;

        return 0;



    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务