BZOJ_1021_[SHOI2008]_Debt循环的债务_(DP)

时间:2022-06-02 18:26:00

描述


http://www.lydsy.com/JudgeOnline/problem.php?id=1021

三个人相互欠钱,给出他们每个人各种面额的钞票各有多少张,求最少需要传递多少张钞票才能把账还清.

分析


用\(f[i][j][k]\)表示用过前\(i\)种钞票后,A有\(j\)元,B有\(k\)元所需要的步数.

然后DP就好了.

 #include <bits/stdc++.h>
using namespace std; const int maxn=+,INF=~0u>>;
int sum,t;
int x[],h[],g[],m[]={,,,,,},num[];
int cnt[][];
int f[][maxn][maxn];
inline void solve(){
if(g[]<||g[]<||g[]<){ puts("impossible"); return; }
for(int j=;j<maxn;j++)for(int k=;k<maxn;k++) f[][j][k]=f[][j][k]=INF;
f[][h[]][h[]]=;
for(int i=;i<;i++){
for(int j=;j<maxn;j++)for(int k=;k<maxn;k++) f[t][j][k]=INF;
for(int j=;j<=sum;j++)for(int k=;k+j<=sum;k++){
if(f[t^][j][k]<INF){
for(int a=;a<=num[i];a++)for(int b=;a+b<=num[i];b++){
int ta=j+m[i]*(a-cnt[][i]),tb=k+m[i]*(b-cnt[][i]);
if(ta>=&&tb>=&&ta+tb<=sum){
int d=(abs(cnt[][i]-a)+abs(cnt[][i]-b)+abs(cnt[][i]-num[i]+a+b))/;
f[t][ta][tb]=min(f[t][ta][tb],f[t^][j][k]+d);
}
}
}
}
t^=;
}
if(f[t^][g[]][g[]]==INF) puts("impossible");
else printf("%d\n",f[t^][g[]][g[]]);
}
inline void init(){
scanf("%d%d%d",&x[],&x[],&x[]);
for(int i=;i<;i++)for(int j=;j<;j++) scanf("%d",&cnt[i][j]), g[i]+=cnt[i][j]*m[j], h[i]+=cnt[i][j]*m[j], sum+=cnt[i][j]*m[j], num[j]+=cnt[i][j];
for(int i=;i<;i++) g[i]-=x[i], g[(i+)%]+=x[i];
}
int main(){
init();
solve();
return ;
}

1021: [SHOI2008]Debt 循环的债务

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 832  Solved: 432
[Submit][Status][Discuss]

Description

  Alice、Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题。
不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务的时候尽可能少的交换现金。比如说,Al
ice欠Bob 10元,而Cynthia和他俩互不相欠。现在假设Alice只有一张50元,Bob有3张10元和10张1元,Cynthia有3
张20元。一种比较直接的做法是:Alice将50元交给Bob,而Bob将他身上的钱找给Alice,这样一共就会有14张钞票
被交换。但这不是最好的做法,最好的做法是:Alice把50块给Cynthia,Cynthia再把两张20给Alice,另一张20给
Bob,而Bob把一张10块给C,此时只有5张钞票被交换过。没过多久他们就发现这是一个很棘手的问题,于是他们找
到了精通数学的你为他们解决这个难题。

Input

  输入的第一行包括三个整数:x1、x2、x3(-1,000≤x1,x2,x3≤1,000),其中 x1代表Alice欠Bob的钱(如
果x1是负数,说明Bob欠了Alice的钱) x2代表Bob欠Cynthia的钱(如果x2是负数,说明Cynthia欠了Bob的钱) x3
代表Cynthia欠Alice的钱(如果x3是负数,说明Alice欠了Cynthia的钱)
接下来有三行
每行包括6个自然数:
a100,a50,a20,a10,a5,a1
b100,b50,b20,b10,b5,b1
c100,c50,c20,c10,c5,c1
a100表示Alice拥有的100元钞票张数,b50表示Bob拥有的50元钞票张数,以此类推。
另外,我们保证有a10+a5+a1≤30,b10+b5+b1≤30,c10+c5+c1≤30,而且三人总共拥有的钞票面值总额不会
超过1,000。

Output

  如果债务可以还清,则输出需要交换钞票的最少张数;如果不能还清,则输出“impossible”(注意单词全部
小写,输出到文件时不要加引号)。

Sample Input

输入一
10 0 0
0 1 0 0 0 0
0 0 0 3 0 10
0 0 3 0 0 0
输入二
-10 -10 -10
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0

Sample Output

输出一
5
输出二
0

HINT

对于100%的数据,x1、x2、x3 ≤ |1,000|。

Source

BZOJ_1021_[SHOI2008]_Debt循环的债务_(DP)的更多相关文章

  1. BZOJ 1021&colon; &lbrack;SHOI2008&rsqb;Debt 循环的债务&lpar; dp &rpar;

    dp(i, j, k)表示考虑了前i种钱币(从小到大), Alice的钱数为j, Bob的钱数为k, 最小次数. 脑补一下可以发现, 只有A->B.C, B->A.C, C->A.B ...

  2. bzoj1021 &lbrack;SHOI2008&rsqb;Debt 循环的债务

    前天打了一场比赛,让我知道自己Dp有多弱了,伤心了一天,没刷bzoj. 昨天想了一天,虽然知道几何怎么搞,但我还是不敢写,让我知道自己几何有多弱了,伤心了一天,没刷bzoj 1021: [SHOI20 ...

  3. BZOJ 1021 &lbrack;SHOI2008&rsqb;Debt 循环的债务

    1021: [SHOI2008]Debt 循环的债务 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 694  Solved: 356[Submit][S ...

  4. bzoj千题计划111:bzoj1021&colon; &lbrack;SHOI2008&rsqb;Debt 循环的债务

    http://www.lydsy.com/JudgeOnline/problem.php?id=1021 如果A收到了B的1张10元,那么A绝对不会把这张10元再给C 因为这样不如B直接给C优 由此可 ...

  5. 1021&colon; &lbrack;SHOI2008&rsqb;Debt 循环的债务 - BZOJ

    Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务的 ...

  6. &lbrack;bzoj1021&rsqb;&lbrack;SHOI2008&rsqb;Debt 循环的债务 &lpar;动态规划&rpar;

    Description Alice. Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题.不过,鉴别钞票的真伪是一件很麻烦的事情,于是他 们决定要在清还债 ...

  7. 【BZOJ 1021】&lbrack;SHOI2008&rsqb;Debt 循环的债务

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1021 [题意] [题解] 设f[i][j][k]表示前i种面值的钱币; 第一个人当前的 ...

  8. 【BZOJ】【1021】【SHOI2008】Dept循环的债务

    DP 去膜拜题解了>_>玛雅原来是动规…… 让我先理解一下为什么要用动规:这个题根据钱数推方案其实是无从下手的……(线性规划?……事实证明我想多了) 啦-我们先来看个超级简化版的问题:怎么 ...

  9. 【BZOJ1021】&lbrack;SHOI2008&rsqb;循环的债务(动态规划)

    [BZOJ1021][SHOI2008]循环的债务(动态规划) 题面 BZOJ 洛谷 题解 感觉以前的题目都好小清新啊,我这种智商丢失的选手完全写不动. 这题看着就像一个\(dp\),并且我们发现每种 ...

随机推荐

  1. iOS之百度导航SDK的坐标转换

    百度导航 iOS SDK的坐标转换代码示例,有需要的朋友可以参考下. //导航坐标--------------> 地图坐标 //假设从导航sdk取到了一个点坐标是(116.304847, 40. ...

  2. 把本地代码同步到github

    2016-05-03 12:52:00 把代码同步到远程github,还算比较顺利.主要参考了以下两个博客,谢谢 http://blog.csdn.net/duxinfeng2010/article/ ...

  3. python统计列表内元素个数

    代码如下: list01 = ['a','b','c','a','c'] set01 = set(list01) print(set01) dict01 = {} for item in set01: ...

  4. Tornado,了解一下

    多了解不一样的PYTHON框架,对深入了解DJANGO,总是有帮助的. import textwrap import tornado.httpserver import tornado.ioloop ...

  5. 1098&period; Insertion or Heap Sort &lpar;25&rpar;

    According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...

  6. 存储过程&amp&semi;Function

    存储过程&Function 编号 类别 ORACLE MYSQL 注释 1 创建存储过程语句不同 create or replace procedure P_ADD_FAC(   id_fac ...

  7. MyBatis(4):动态SQL

    什么是动态SQL MyBatis的一个强大特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件串联SQL字符串在一起是多么地痛苦,确保不能忘了空格或者在列表的最后的 ...

  8. js按值传递和按引用传递

    摘要:js的数据类型有种划分方式为 原始数据类型和 引用数据类型. 原始数据类型 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置.栈区包括了 变量的标识符和变量的值. ...

  9. UCSC下载ENCODE数据

    ENCODE数据库用于存放基因组原件,所有的测序数据(原始数据以及每一步处理后的数据以及最终的结果)都是开放下载的.假如说去官网下载的话会比较麻烦,这里可以通过UCSC的数据库下载(真的是神器啊)!下 ...

  10. 用tar压缩xz格式出错

    解决办法 安装xz软件包 yum install xz -y