【发布时间】:2016-12-08 07:22:35
【问题描述】:
这是对TopCoder SRM 466 "Lottery Ticket" problem 的提交。我已经看到这种模式多次用于这个问题。
尼克喜欢玩彩票。一张彩票的成本就是价格。尼克正好有四张钞票,其值为
b1、b2、b3和b4(其中一些值可能相等)。他想知道是否可以在不取回任何零钱的情况下购买一张彩票。换句话说,他想用他的纸币的任何子集支付一张票的确切价格。如果可能,则返回“POSSIBLE”,否则返回“IMPOSSIBLE”(为清楚起见,所有引号)。
string buy(int p, int b1, int b2, int b3, int b4) {
int arr[] = {b1, b2, b3, b4};
for (int msk = 0; msk < (1 << 4); ++msk) {
int sum = 0;
for (int i = 0; i < 4; ++i) {
if (msk & (1 << i)) {
sum += arr[i];
}
}
if (sum == p) return "POSSIBLE";
}
return "IMPOSSIBLE";
}
有人能解释一下这是如何工作的吗?我不明白他为什么将值放入一个数组并使用两个嵌套的 for 循环进行循环。
【问题讨论】: