ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NC16671 [NOIP2006]金明的预算方案

2022-09-13 14:02:18  阅读:148  来源: 互联网

标签:NC16671 NOIP2006 题目 乘积 int 66 物品 金明


题目

  • 原题地址:[NOIP2006]金明的预算方案
  • 题目编号:NC16671
  • 题目类型:DP、分组背包
  • 时间限制:C/C++ 1秒,其他语言2秒
  • 空间限制:C/C++ 32768K,其他语言65536K

1.题目大意

  • 总钱数为n,有m个物品,每个物品有价格v,重要度p,从属关系q,求不超过总钱数,可以得到的重要度与价格乘积的最大值。

2.题目分析

  • v存价格,p存重要度与价格的乘积,q存从属关系,f[i]存使用钱数不超过i时的可获得的最大乘积值,g[i]存中间计算量
  • 每次选择主物品,初始化数组g,更新g为容量为k时不选择从物品和容量为k-v[j]时选择选择从物品的乘积最大值
  • 最后用g来更新f,取每个元素的较大者为新的f

3.题目代码

#include <bits/stdc++.h>

using namespace std;

int n, m, v[66], p[66], q[66], g[32003], f[32003];

int main() {
    cin >> n >> m;
    for(int i=1;i<=m;i++) cin >> v[i] >> p[i] >> q[i], p[i] *= v[i];
    for(int i=1;i<=m;i++) {if(!q[i]) {
        for(int j=v[i];j<=n;j++) g[j] = f[j-v[i]] + p[i];
        for(int j=1;j<=m;j++) if(q[j]==i)
            for(int k=n;k>=v[i]+v[j];k--)
                g[k] = max(g[k], g[k-v[j]]+p[j]);
        } for(int j=1;j<=n;j++) f[j] = max(f[j], g[j]);
    } cout << f[n] << endl;
}

标签:NC16671,NOIP2006,题目,乘积,int,66,物品,金明
来源: https://www.cnblogs.com/zhangyi101/p/16688888.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有