题解 | #购物单#不限制附件个数时的解法

购物单

https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4

#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main() {
    int n,m;
    cin>>n>>m;//n表示总钱数 m表示可购买的物品的个数
    vector<int> v;vector<vector<int>> nums;
    map<int,vector<vector<int>>> M;
    for(int i=1;i<=m;i++)
    {
        int v,p,q;//价值 重要度 主附件
        cin>>v>>p>>q;
        M[q].push_back({i,v,p,q});
    }
    for(int i=0;i<M[0].size();i++)
    {
        nums.push_back(M[0][i]);
        for(int j=0;j<M[M[0][i][0]].size();j++)
            nums.push_back(M[M[0][i][0]][j]);
    }
    vector<vector<int>> dp(nums.size()+1,vector<int>(n+1,0));
    int ans=0;
    for(int i=0;i<nums.size();i++)
    {  
        for(int j=10;j<=n;j+=10)
        {
            if(nums[i][3]==0)
            {
                if(nums[i][1]<=j)
                {
                    dp[i][j]=nums[i][1]*nums[i][2];
                    for(int k=i-1;k>=0;k--)
                        dp[i][j]=max(dp[i][j],dp[k][j-nums[i][1]]+nums[i][1]*nums[i][2]);
                }
            }
            else//需要保证选择附件,就必须选择主件
            {
                if(j-nums[i][1]>=0)
                {
                    for(int k=i-1;;k--)//i前面的数
                    {
					  //这两个判断条件保证必须选择主件
                        if(dp[k][j-nums[i][1]]>0)
                            dp[i][j]=max(dp[i][j],dp[k][j-nums[i][1]]+nums[i][1]*nums[i][2]); 
                        if(nums[k][3]==0)
                            break;
                    }
                }   
            }
            ans=max(ans,dp[i][j]);
        }
    }
   cout<<ans;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

不懂!!!:感觉你的项目描述太简单了,建议使用star描述法优化提炼一下,就是使用什么技术或方案解决了什么问题,有什么效果或成果,例如:对axios进行了二次封装,实现了请求的统一管理、错误的集中处理以及接口调用的简化,显著提高了开发效率和代码维护性,使用canvas技术实现了路线绘制功能,通过定义路径绘制函数和动态更新机制,满足了简化的导航可视化需求,提升了用户体验。像什么是使用其他组件库,基本功能描述就最好不要写到项目成果里面去了,加油
点赞 评论 收藏
分享
03-31 16:42
已编辑
郑州西亚斯学院 后端
Java抽象带篮子:你简历少了几个模块看上去就感觉信息很少,简历怎么写可以看看我发的帖子
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务