SlideShare a Scribd company logo
1 of 10
Download to read offline
会津合宿 2017 Day3
D - 優柔不断 -
原案:瀧澤
問題文:瀧澤
解答:瀧澤、鈴木
解説:鈴木
2017/09/20
D 問題の D は DP の D なので解法は DP
※ Dijkstra の D という説も有力
問題概要
特殊なナップサック問題
N 個のアイテムと予算 C がある
各アイテム i は 2 種類の価値 ai, bi と費用 ci を持つ
ai と bi の値は交換しても良い
予算内でアイテムを選択し,a 側の価値総和を A,b 側の価値総和を B
としたとき,min{A, B} を最大化せよ
制約
1 ≤ N ≤ 100, 1 ≤ C ≤ 100
1 ≤ bi < ai ≤ 100, 1 ≤ ci ≤ 100
3 / 10
誤解法例 1
全探索
考えうる組合せをすべて探索
取る/取らないの他に価値の交換も考えると,1 アイテムあたり 3 分岐
O(3N
) はさすがに TLE
4 / 10
誤解法例 2
考えうる価値の組を動的計画法で求める
dp[i][A][B] = アイテム i までで,価値総和の組が (A, B) となるときの
最小費用
更新式
dp[i][A][B] =
min



dp[i − 1][A][B] i を使わない
dp[i − 1][A − ai][B − bi] + ci ai, bi を交換せずに使う
dp[i − 1][A − bi][A − ai] + ci ai, bi を交換して使う
dp[N][A][B] ≤ C ならば, 組 (A, B) はありえる
雑に見積もって O(N(
∑N
i=1 ai)2
) となるが残念ながら TLE
5 / 10
考察
A に対して,B の候補として X, Y があり X < Y のとき
価値の組 (A, X) よりも,(A, Y ) の方が有力である
min{A, X} ≤ min{A, Y } だから
よって,A が固定されたとき,B の取りうる値の中で最大値にだけ着
目すれば十分である
6 / 10
想定解法
以下のような動的計画法
dp[i][x][A] = アイテム i までで,予算 x で価値総和 A を達成するとき
の価値総和 B の最大値
更新式は
dp[i][x][A] =
max



dp[i − 1][x][A] i を使わない
dp[i − 1][x − ci][A − ai] + bi ai, bi を交換せずに使う
dp[i − 1][x − ci][A − bi] + ai ai, bi を交換して使う
0 ≤ x ≤ C, 0 ≤ A ≤
∑N
i=1 ai の範囲で min{A, dp[N][x][A]} を調べる
実は ai, bi が交換可能であることは問題の本質ではない
計算量は O(NC
∑N
i=1 ai) で,これは間に合う
7 / 10
おまけ
多目的最適化
目的関数(本問では価値)が複数ある最適化問題を多目的最適化問題
という
最適性の定義が特殊 : 他の各解に対して,劣らない目的関数値が存在す
れば良い
目的関数値が異なる複数の解が最適性を持ちうる
本問は多目的ナップサック問題の 2 目的かつ価値交換可能という変
種版
上記の最適性を持つ解のうち、さらに条件を加えた解を要求している
想定解法の DP でなくても,多目的最適化用のアルゴリズムでうまく
解けるかもしれません
(今のところは) 競プロの範疇ではないと思うので,深くは触れません
8 / 10
Writer 解
瀧澤 (C++, 50 行)
鈴木 (C++, 39 行) (Java, 40 行)
9 / 10
提出状況
First AC
Onsite : ACPC_remonKTC7 (31 min)
Online : hamayanhamayan (13 min)
正答率
23 / 56 (41.07%)
10 / 10

More Related Content

What's hot

Gcd
GcdGcd
Gcd
oupc
 
GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案
Koji Kitano
 
RUPC2014_Day3_G
RUPC2014_Day3_GRUPC2014_Day3_G
RUPC2014_Day3_G
Yuma Inoue
 
GPUによる多倍長整数乗算の高速化手法の提案とその評価
GPUによる多倍長整数乗算の高速化手法の提案とその評価GPUによる多倍長整数乗算の高速化手法の提案とその評価
GPUによる多倍長整数乗算の高速化手法の提案とその評価
Koji Kitano
 
ハイブリッド型樹木法
ハイブリッド型樹木法ハイブリッド型樹木法
ハイブリッド型樹木法
Mitsuo Shimohata
 

What's hot (15)

HUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD RushHUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD Rush
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説
 
Gcd
GcdGcd
Gcd
 
GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案
 
RUPC2014_Day3_G
RUPC2014_Day3_GRUPC2014_Day3_G
RUPC2014_Day3_G
 
AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説AtCoder Regular Contest 026 解説
AtCoder Regular Contest 026 解説
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説
 
GPUによる多倍長整数乗算の高速化手法の提案とその評価
GPUによる多倍長整数乗算の高速化手法の提案とその評価GPUによる多倍長整数乗算の高速化手法の提案とその評価
GPUによる多倍長整数乗算の高速化手法の提案とその評価
 
Estimating Mutual Information for Discrete‐Continuous Mixtures 離散・連続混合の相互情報量の推定
Estimating Mutual Information for Discrete‐Continuous Mixtures 離散・連続混合の相互情報量の推定Estimating Mutual Information for Discrete‐Continuous Mixtures 離散・連続混合の相互情報量の推定
Estimating Mutual Information for Discrete‐Continuous Mixtures 離散・連続混合の相互情報量の推定
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説
 
DP特集
DP特集DP特集
DP特集
 
ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解
 
RUPC 2019 Day3 A: 情報検索
RUPC 2019 Day3 A: 情報検索RUPC 2019 Day3 A: 情報検索
RUPC 2019 Day3 A: 情報検索
 
ハイブリッド型樹木法
ハイブリッド型樹木法ハイブリッド型樹木法
ハイブリッド型樹木法
 
資本コスト
資本コスト資本コスト
資本コスト
 

More from HCPC: 北海道大学競技プログラミングサークル

More from HCPC: 北海道大学競技プログラミングサークル (20)

写像 12 相
写像 12 相写像 12 相
写像 12 相
 
ACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2017 Day3 F: 掛け算は楽しいACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2017 Day3 F: 掛け算は楽しい
 
ACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFSACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFS
 
ACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取りACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取り
 
ACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェ
 
ACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探しACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探し
 
HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木
 
HUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャムHUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャム
 
HUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMGHUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMG
 
HUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺しHUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺し
 
HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号
 
HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元
 
HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?
 
HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価
 
HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍
 
HUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four teaHUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four tea
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
プログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニックプログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニック
 
RUPC 2019 Day3 G: Donuts Orientation
RUPC 2019 Day3 G: Donuts OrientationRUPC 2019 Day3 G: Donuts Orientation
RUPC 2019 Day3 G: Donuts Orientation
 
RUPC 2019 Day3 D: 矢
RUPC 2019 Day3 D: 矢RUPC 2019 Day3 D: 矢
RUPC 2019 Day3 D: 矢
 

ACPC 2017 Day3 D: 優柔不断