"""人工成本演示：成组保留条件与结论。没有真实 Tokenizer 或模型调用。"""
from dataclasses import dataclass


@dataclass(frozen=True)
class Bundle:
    # 同一包内的内容一起选择，不能单独舍弃政策适用条件。
    name: str
    cost: int
    priority: int
    required: bool = False


def select(bundles: list[Bundle], budget: int) -> tuple[list[str], list[str]]:
    """先保障必需项，再按优先级选择完整可选包；不是背包最优解。"""
    if budget < 0 or any(b.cost < 0 for b in bundles):
        raise ValueError("预算与成本不能为负")
    required = [b for b in bundles if b.required]
    used = sum(b.cost for b in required)
    if used > budget:
        # 显式失败，不能悄悄把必需内容挤掉。
        raise ValueError("必需内容超过预算，需要改变调用方案")
    chosen = [b.name for b in required]
    omitted = []
    optional = sorted((b for b in bundles if not b.required),
                      key=lambda b: (-b.priority, b.name))
    for bundle in optional:
        if used + bundle.cost <= budget:
            chosen.append(bundle.name)
            used += bundle.cost
        else:
            omitted.append(bundle.name)
    return chosen, omitted


if __name__ == "__main__":
    # 成本是人工单位，只用于观察算法，不能解释为中文 Token 数。
    bundles = [Bundle("规则与问题", 30, 100, True),
               Bundle("订单状态", 20, 100, True),
               Bundle("用户纠正", 10, 100, True),
               Bundle("完整政策", 35, 90), Bundle("旧产品介绍", 25, 10)]
    print(select(bundles, 100))
    # 若政策被判定为本任务必需，应设置 required=True；不足时就明确失败。
