lanqiao OJ 金明的预算方案

简介: lanqiao OJ 金明的预算方案

15 届蓝桥杯14天国特冲刺营_蓝桥杯 - 蓝桥云课

分组背包问题

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define v first 
#define w second 
 
using namespace std ; 
const int N = 2e5 +10 ;
int f[N] ;
typedef pair<int,int> PII ;
PII master[N] ;//用于记录主件,如果主件的v等于零,说明这个编号的零件不是主件 
vector<PII> s[N] ;//用于记录附件,对于编号为i的主件的附件 
int n , m ;
int main(){
  cin >> m >> n ;
  for(int i = 1 ; i <= n ;i ++){
    int a , b , c ;
    cin >> a >> b >> c ;
    if(c==0){
      master[i] = {a,a*b} ;//加入主键 
    }else {
      s[c].push_back({a,a*b}) ;//加入附件 
    }
  }
  for(int i = 1 ; i <= n ;i ++){
    if(master[i].v == 0) continue ;//如果不是主件,就直接continue; 
    else{
      for(int j = m ; j >= 0 ; j --){
        PII tmp = master[i];
        for(int k = 0 ; k < 1 << s[i].size() ; k++){
          int  v = tmp.v ; int w = tmp.w ;//如果要选附件,主件必须选 
          for(int u = 0 ; u <= s[i].size() ; u ++  ){//利用二进制的方法来求附件的选择和不选择 
            if((k>>u)&1){
              v += s[i][u].v ;
              w += s[i][u].w ;
            }
          }
          if(j >= v ) f[j] = max(f[j],f[j-v] + w) ;
        }
      }
      
      
    }
  }
  cout << f[m] << endl ;
}
目录
相关文章
|
算法 Android开发 索引
LeetCode 周赛上分之旅 #44 同余前缀和问题与经典倍增 LCA 算法
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
81 0
|
1月前
lanqiao OJ 1024 游园安排
lanqiao OJ 1024 游园安排
20 3
|
1月前
lanqiao oj 机房
lanqiao oj 机房
15 1
|
1月前
lanqiao OJ 拉马车
lanqiao OJ 拉马车
10 0
|
5月前
|
Java
技术经验分享:hdu3549初试最大流问题
技术经验分享:hdu3549初试最大流问题
20 0
|
算法 测试技术 Android开发
LeetCode 周赛上分之旅 #39 结合中心扩展的单调栈贪心问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
66 1
|
6月前
【每日一题Day167】LC1000合并石头的最低成本 | 区间dp
【每日一题Day167】LC1000合并石头的最低成本 | 区间dp
55 1
【每日一题Day167】LC1000合并石头的最低成本 | 区间dp
|
6月前
【每日一题Day171】LC1125最小的必要团队 | 01背包 位运算
【每日一题Day171】LC1125最小的必要团队 | 01背包 位运算
44 1
|
6月前
蓝桥备战--纪念品分组OJ532,贪心证明
蓝桥备战--纪念品分组OJ532,贪心证明
28 0