首页 > 其他分享 >背包dp

背包dp

时间:2024-05-23 15:40:00浏览次数:14  
标签:背包 主件 int 更新 vct typ dp

P1064 [NOIP2006 提高组] 金明的预算方案

思路:有依赖的背包。主要的问题和解决方案,见代码注释.

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int N=2e5+10;

typedef struct node{
    int p,w,typ;
}node;
bool cmp(node a,node b){
    if(a.typ!=b.typ) return a.typ<b.typ;
    return a.p<b.p;
}
int money,n;
int dp[40000];     ////dp[j] 定义为:花费j钱,最多可以得到的满意度
vector<node> vct[65];
void solve(){                       ////有依赖的背包
    cin>>money>>n;
    for(int i=1;i<=n;i++){
        node x; cin>>x.p>>x.w>>x.typ;
        if(x.typ==0) vct[i].emplace_back(x);
        else vct[x.typ].emplace_back(x);
    }
    for(int i=1;i<=n;i++) sort(vct[i].begin(),vct[i].end(),cmp);
    for(int i=1;i<=n;i++){            ////枚举主件.
        for(int j=money;j>=0;j-=10){
            if(vct[i].empty()) continue;
            int num=(int)vct[i].size();
            for(int g=0;g<(1ll<<(num-1));g++){ ////这里是<,不能是<= ////二进制枚举该主件的附件的选取状况---有很关键的一句话:每个主件只会有0,1,2个附件.所以这里不会很大.
                int p=vct[i][0].p;
                int v=vct[i][0].p*vct[i][0].w;
                for(int h=0;h<num-1;h++){
                    if((1ll<<h)&g){
                        p+=vct[i][h+1].p;
                        v+=vct[i][h+1].p*vct[i][h+1].w;
                    }
                }
                if(j>=p) dp[j]=max(dp[j],dp[j-p]+v);        ////在这个主件中,总是先更新大的j,再更新小的j
                ////for(int j=money;j>=p;j--) dp[j]=max(dp[j],dp[j-p]+v);         ////在该状态下的p和v
                ////在这里枚举金钱的话,可能导致同一个主件的不同附件状态多次更新答案,这是不行的.
                ////在某一个主件的集合中,只能从中选取一次。答案不能被同一个集合重叠更新。意思是:假如取了主件1和附件1,那么取了主件1和附件2就不能从取主件1和附件1转移过来.
                ////这是个最严重的问题,重叠更新了!!---解决方案:在枚举这个主件中,只能先更新大的j,再更新小的j。否则同一个主件中小的j会更新同一个主件大的j
            }
        }
    }
    cout<<dp[money];
}
////带有前提条件:
////在考虑附件的时候,怎么转移呢?怎么知道它的主件是否购买了?a主件和b主件同时购买了是什么状态?只购买了a主件又是什么状态?
////这个题的决策是五个,分别是:
////1.不选,然后去考虑下一个
////2.选且只选这个主件          ////怎么转移呢,如果选了这个主件是亏的,但是附件可以转亏为盈呢..---在主件选了的情况下,二进制枚举附件的状态即可.
////3.选这个主件,并且选附件1
////4.选这个主件,并且选附件2
////5.选这个主件,并且选附件1和附件2.
signed main(){
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

 

标签:背包,主件,int,更新,vct,typ,dp
From: https://www.cnblogs.com/ouhq/p/18208601

相关文章

  • Dplayer播放m3u8
    <!--引入DPlayer--><linkrel="stylesheet"href="https://cdn.jsdelivr.net/npm/dplayer/dist/DPlayer.min.css"><scriptsrc="https://cdn.jsdelivr.net/npm/hls.js/dist/hls.min.js"></script><scriptsrc=&quo......
  • 私有云和多云管理平台 | Cloudpods v3.10.15 正式发布
    功能优化【主机】裸金属详情页增加部分属性信息【监控】优化告警策略,支持同时设置多监控指标【主机】支持透传设备自动探测【主机】LVM块存储支持快照【监控】简化Telegraf容器的挂载点【主机】新建VMware支持同时填写备注信息【存储】KVM支持对接LVM存储问题修......
  • QCM4490 typec线和ADPmicrob线的检测流程
    1、typec线识别流程(ADP开关和USB_OPTION的开关切到typec那边)usb_id_irq_handler-->切换模式micro_usb_set_mode  2、adpmicrob线检测流程client_data.id=MSG_OWNER_BC;client_data.name="battery_charger";client_data.msg_cb=battery_chg_callba......
  • EDP .Net开发框架--组织架构
    职类职类是将职务进行分类管理,并定义了职类标记和职级。职类标记会带入到该职类下的职务作为职务的标记,并为职务提供职级范围选择。“高管类”职类定义了其职级范围为“PM13至PM16”,那么该职类下的职务的职级就只能在这个范围内。职务定义和管理组织架构中的职务。职务必须......
  • WordPress标签实现追加自定义链接
    WordPress标签的用处说多不多,说少不少,其中利用WordPress标签做聚合页面优化是一种搜索引擎很喜欢的方式,或者说很多搜索引擎相比正文页面而言更喜欢抓取和收录标签页面,其次对于WordPress标签的作用就是用于文章关键词调用以及文章内链。那么今天子凡我我将利用几行代码来实......
  • E - Remove Pairs(状压dp+博弈论)
     ​思路:容易发现,我们取走一张牌后:如果下一步的人必败,则这一步的人必胜,因为可以走这个状态。反之,这个人必败。代码:#include<bits/stdc++.h>usingnamespacestd;intn,a[21],b[21],f[2000005];intmain(){ios::sync_with_stdio(false);cin.tie(0);cout.t......
  • 提升WordPress网站加载速度的8个小技巧
    提升WordPress网站加载速度是至关重要的,它不仅可以提高用户体验,还有助于SEO排名。以下是提升WordPress网站加载速度的8个小技巧,希望能帮助到大家。优化图片:使用适当大小和格式的图片。利用插件(如Smush或EWWWImageOptimizer)对图片进行压缩。启用缓存:使用WordPress缓存......
  • 决策单调性优化DP
    @目录决策单调性四边形不等式决策单调性形式1法1分治法2二分队列例题P3515Solution形式2例题P3195Solution形式3例题CF833BSolution形式4例题Solution后话同步发表于CSDN决策单调性四边形不等式定义:对于二元函数\(w(x,y)\),若\(\foralla,b,c,d\in\mathbb{Z}\),且\(a......
  • 三次握手和四次挥手、UDP、TCP、粘包问题、模块回顾
    【一】三次握手和四次挥手【1】TCP协议的三次握手和四次挥手TCP协议位于osi七层协议中的传输层(1)使用三次握手来建立连接一次握手:客户端发送带有SYN(SEQ=x)标志的数据包---》服务端,然后客户端进入SYN_SEND状态,等待服务器的确认。二次握手:服务端发送带有SYN+A......
  • m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码率
    1.算法仿真效果matlab2022a仿真结果如下:   2.算法涉及理论知识概要      低密度奇偶校验码(Low-DensityParity-CheckCode,LDPC码)是一种高效的前向纠错码,广泛应用于无线通信、数据存储等领域。BP(BeliefPropagation)译码算法,又称为消息传递算法,是LDPC码最常用......