买礼物


Submit solution

Points: 100
Time limit: 1.0s
Memory limit: 80M

Author:
Problem type
Allowed languages
C, C++

买礼物

背景故事

又到了明明的生日。为了犒劳自己,他计划入手 \(B\) 样心仪的小物件。每样单独买都要 \(A\) 元。不过店家最近在做"连带购买"的促销:在已买过某一件商品的前提下,再去买另一件时,可能以特价入手。

你的任务是:在所有可能的购买顺序中,求出完成全部 \(B\) 件购买所需的最小总花费


规则说明

  • 一共有 \(B\) 件商品(从 1 到 \(B\) 编号),单独买任意一件的价格都是 \(A\) 元。
  • 若你已经买过第 \(I\) 件,再买第 \(J\) 件,可选择支付 \(K_{I,J}\) 元(促销价)。并且满足 \(K_{I,J}=K_{J,I}\)
  • 特别地,若 \(K_{I,J}=0\),表示这两件之间没有任何优惠关系(并不是 0 元购买!)。此时买第 \(J\) 件仍需按常规方式:

    • 要么直接以 \(A\) 元购买;
    • 要么依赖其他已购商品与 \(J\) 形成的优惠(若存在)。
  • 促销价 可能大于 原价 \(A\)。如果 \(K_{I,J} > A\),你当然可以选择直接以 \(A\) 元购买更划算。

你的目标是选择一个最优购买顺序,并在每一步自由选择"用谁触发优惠"或"直接以 \(A\) 元购买",使得最终买齐所有 \(B\) 件商品的总花费最小。


输入格式

  • 第一行:两个整数 \(A, B\)。
  • 接下来 \(B\) 行,每行 \(B\) 个整数:第 \(I\) 行第 \(J\) 列是 \(K_{I,J}\)。

保证:

  • \(K_{I,J} = K_{J,I}\)
  • \(K_{I,I} = 0\)

重要说明:

  • \(K_{I,J} = 0\) 表示"无优惠关系",不是 0 元购买。
  • \(K_{I,J}\) 可能大于 \(A\)。

输出格式

输出一个整数,表示在最优策略下,买齐 所有 \(B\) 件商品所需的最小总费用


样例一

输入

1 1
0

输出

1

解释:只有 1 件商品,直接以 \(A=1\) 元买下即可。


样例二

输入

3 3
0 2 4
2 0 2
4 2 0

输出

7

解释: 一种最优策略:先买第 2 件花 3 元;接着利用优惠,以 2 元买第 1 件;再以 2 元买第 3 件。总费用 \(3+2+2=7\)。 注意同时存在多个优惠时,可以自由选择最便宜的那条,例如不会选择用 4 元去买还能 2 元买到的那件。


数据范围

  • 对于 30% 的数据:\(1 \le B \le 10\)。
  • 对于 100% 的数据:\(1 \le B \le 500,\quad 0 \le A, K_{I,J} \le 1000\)。


Comments

There are no comments at the moment.