问题描述
奇妙的交易X国是一个很特殊的国家,在这个国家的货币只有 种面值。只要你需要(有这么多钱),你可以让 无限大。同时在这个国家有一个很有趣的拍卖场有一条奇怪的规矩:一次交易中,买卖双方只能对每种面值的货币使用不超过两次。 比如,买一件价格 为198的物品, 的情况,买家可以使用2张 元纸币,卖家则给出物品和2张 元纸币。因为奇怪的规则,很多X国人都需要在这个拍卖场交易之前判断一下这个物品是否可以被交易成功。不过很多人并不擅长这种计算,这时候就要请出聪明的你。
输入格式
输入 ,代表货币的 和物品的价值 。
输出格式
输出 YES 或者 NO 代表是否可以被交易成功。
输入样例
10 9
200 40199
108 50
输出样例
YES
YES
NO
数据范围
题解:
背包问题
function solution(V, W) {
// 收集所有可用的面值,直到面值超过W为止
let values = [];
let power = 1; // V^0 = 1
while (power <= W) {
values.push(power);
power *= V; // 计算下一个面值 V^1, V^2, ...
}
// 用一个集合来跟踪我们能形成的所有值
let canForm = new Set();
canForm.add(0); // 从0开始,总是能形成0这个值
for (let value of values) {
// 当前可形成的值副本
let currentPossible = Array.from(canForm);
for (let count = 1; count <= 2; count++) { // 要添加1次或2次面值
for (let addition of currentPossible) {
canForm.add(addition + value * count);
}
}
}
// 检查是否能形成W
return canForm.has(W) ? "YES" : "NO";
}
function main() {
// Add your test cases here
console.log(solution(10, 9) === "Yes");
console.log(solution(200, 40199) === "Yes");
console.log(solution(108, 50) === "NO");
}
main();