#背包#洛谷 4026 [SHOI2008]循环的债务
分析
设\(dp[t][n][m]\)表示前\(t\)种钞票\(\text{Alice,Bob}\)分别拥有\(n,m\)元所需最小交换钞票数,
枚举\(\text{Alice,Bob}\)最后得到这种钞票的个数\(t0,t1\)
\(\text{Cynthia}\)最后便获得\(cnt-t0-t1\)张,
那么
\]
如果\(\text{Alice}\)得到\(\text{Cynthia}\)的欠款仍然还不起\(\text{Bob}\)显然无解,
对于其余两人亦然
代码
#include <cstdio>
#include <cstring>
#define rr register
using namespace std;
const int w[6]={100,50,20,10,5,1};
int a[3],b[3][6],s[3],cnt[6],dp[7][1011][1011],inf,m;
inline signed Abs(int x){return x<0?-x:x;}
signed main(){
scanf("%d%d%d",&a[0],&a[1],&a[2]);
for (rr int i=0;i<3;++i) for (rr int j=0;j<6;++j)
scanf("%d",&b[i][j]),s[i]+=b[i][j]*w[j],cnt[j]+=b[i][j];
memset(dp,42,sizeof(dp)),dp[0][s[0]][s[1]]=0;
m=s[0]+s[1]+s[2],inf=dp[1][1][1];
for (rr int i=0;i<6;++i)
for (rr int j=0;j<=m;++j)
for (rr int k=0;k+j<=m;++k)
if (dp[i][j][k]^inf){
if (dp[i+1][j][k]>dp[i][j][k])
dp[i+1][j][k]=dp[i][j][k];
for (rr int t0=0;t0<=cnt[i];++t0)
for (rr int t1=0;t1+t0<=cnt[i];++t1){
rr int z0=j-(b[0][i]-t0)*w[i];
rr int z1=k-(b[1][i]-t1)*w[i];
rr int t2=cnt[i]-t0-t1;
if (z0>=0&&z1>=0&&z0+z1<=m){
rr int now=Abs(b[0][i]-t0)+Abs(b[1][i]-t1)+Abs(b[2][i]-t2);
if (dp[i+1][z0][z1]>dp[i][j][k]+(now>>1))
dp[i+1][z0][z1]=dp[i][j][k]+(now>>1);
}
}
}
rr int ans0=s[0]-a[0]+a[2];
rr int ans1=s[1]-a[1]+a[0];
rr int ans2=s[2]-a[2]+a[1];
if (ans0<0||ans1<0||ans2<0||dp[6][ans0][ans1]==inf)
return !printf("impossible");
else return !printf("%d",dp[6][ans0][ans1]);
}
#背包#洛谷 4026 [SHOI2008]循环的债务的更多相关文章
- 洛谷 P4026 [SHOI2008]循环的债务
水水的dp 设f[i][a][b]表示交换完前i种面值的钞票,第一个人有a元,第二个人有b元的最小代价 直接转移就行了 需要注意的是算的式子 第1个人\(\Delta A\),第二个人\(\Delta ...
- 【BZOJ1021】[SHOI2008]循环的债务(动态规划)
[BZOJ1021][SHOI2008]循环的债务(动态规划) 题面 BZOJ 洛谷 题解 感觉以前的题目都好小清新啊,我这种智商丢失的选手完全写不动. 这题看着就像一个\(dp\),并且我们发现每种 ...
- Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)
题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...
- [luogu4026 SHOI2008]循环的债务 (DP)
传送门 吐槽洛谷难度标签qwq Solution 显然是一道神奇的DP,由于总钱数不变,我们只需要枚举前两个人的钱数就可知第三个人的钱数 DP的时候先枚举只用前k个币种,然后枚举前两个人的钱数,然后枚 ...
- [SHOI2008]循环的债务
Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题. 不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务 ...
- 洛谷 P3965 [TJOI2013]循环格 解题报告
P3965 [TJOI2013]循环格 题目背景 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子. 每个元素有一个坐标(行,列),其中左上角元素坐标为\((0,0)\).给定一个起始位\ ...
- BZOJ.1021.[SHOI2008]循环的债务(DP)
题目链接 不同面额的钞票是可以分开考虑的. ↑其实并不很明白具体(证明?),反正是可以像背包一样去做. f[x][i][j]表示用前x种面额钞票满足 A有i元 B有j元 (C有sum-i-j)所需交换 ...
- 洛谷 P4244 [SHOI2008]仙人掌图 II 解题报告
P4244 [SHOI2008]仙人掌图 II 题目背景 题目这个II是和SHOI2006的仙人掌图区分的,bzoj没有. 但是实际上还是和bzoj1023是一个题目的. 题目描述 如果某个无向连通图 ...
- 洛谷 P4279 [SHOI2008]小约翰的游戏 解题报告
P4279 [SHOI2008]小约翰的游戏 题目描述 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有\(n\)堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子 ...
- BZOJ1021 [SHOI2008]循环的债务
Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题. 不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务 ...
随机推荐
- 【译】代码更快、更好,借助 GitHub Copilot 的新功能:斜杠命令和上下文变量
你是否曾经希望有一个人工智能助手可以帮助你更快更好地编写代码?那就是 Visual Studio Copilot Chat 为您提供的:一个人工智能驱动的结对程序员,可以回答您的问题,建议代码片段,解 ...
- linux基本命令--day02
目录树架构示意图 以下是对这些目录的解释: /bin: bin是Binary的缩写, 这个目录存放着最经常使用的命令. /boot: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以 ...
- Java 客户信息管理软件 (面向对象 封装 总结)
1 package com.bytezero.cim.bean; 2 3 /** 4 * 5 * @Description Customer为实体对象,用来封装客户信息 6 * @author Byt ...
- C++ //list容器 构造函数 //list赋值和交换 //list容器大小操作 //list插入和删除,移除 //清空 //list数据存取back(); front() //list 反转和排序
1 //list容器 构造函数 //list赋值和交换 //list容器大小操作 2 //list插入和删除,移除 //清空 //list数据存取back(); front() 3 //list 反转 ...
- 面试准备不充分,被Java守护线程干懵了,面试官主打一个东西没用但你得会
写在开头 面试官:小伙子请聊一聊Java中的精灵线程? 我:什么?精灵线程?啥时候精灵线程? 面试官:精灵线程没听过?那守护线程呢? 我:守护线程知道,就是为普通线程服务的线程嘛. 面试官:没了?守护 ...
- 闭关修炼180天----手写迷你版的tomcat-Minicat
手写迷你版的tomcat-Minicat 小谈Tomcat Tomcat请求处理⼤致过程 Tomcat是⼀个Http服务器(能够接收并且处理http请求,所以tomcat是⼀个http服务器) 我们使 ...
- 并行化优化KD树算法:使用C#实现高效的最近邻搜索
本文信息 中文名:<并行化优化KD树算法:使用C#实现高效的最近邻搜索> 英文名:"Parallelized Optimization of KD-Tree Algorithm: ...
- 使用 Abp.Zero 搭建第三方登录模块(四):微信小程序开发
简短回顾一下微信小程序端的流程: 用户通过扫码进入小程序的鉴权页面,更新状态到ACCESSED已扫码 用户点击确认授权,微信通过wx.login()接口获取第三方登录的必要信息:Code登录凭证. ...
- [.Net 6]写一个简单的文件上传控件后端
此项目是配合上一篇文章[Vue]写一个简单的文件上传控件 - 林晓lx - 博客园 (cnblogs.com) 的后端程序,使用.Net 6项目框架搭建,开发前请安装Visual Studio 20 ...
- vscode 快速切换窗口 快捷键 设置成 Alt + Q 了
vscode 切换窗口 快捷键 设置成 Alt + Q 了 又换了 换成 快速切换窗口了 quickSwitchWindow 这样方便了 我再感受下一