穿越硬币数量有限的硬币
我编写了一个程序来生成可以在此任务中使用的子集金额::
假设你有 3 $1-coins, 2
$2-coins, 3 $5-coins, 1 $10-coin,
有 4 时尚得到 $10 的
这些硬币。 如果有 n1 $X1
硬币 n2 $X2 硬币 ... nm $Xm 硬币
我们可以获得多少种方式 $X 的
它是有限数量的硬币吗?
如果我们创造了很多 { X1, X1..... X1, X2, X2.......... X2, ..., ..., ............, 嗯,嗯...... Xm}, 然后,当然,我们可以实现它的子集的总和 $X.
但我找不到方法使用套装 {n1, n2, n3.... nm} , {X1, X2, X3.... Xm}.
我的朋友告诉我,这是一种问题背包,但我不知道该怎么做。
这是我写的部分代码 :
如果你如此善良,我会非常好看,并更多地解释了一下。
EDIT
:
这个问题更适合 stackexchange for computer science, 但由于这是我的旧问题,我宁愿在这里编辑它。
可以使用原理来解决这个问题
不包括纳入
, 这很方便,
当我们有固定的硬币时,但每个硬币的金额随着每个请求而变化
.
认为
什么
方法[v] - 这种创造方式
$v
从
$x1
,
$x2
, ..
$xm
, 每个都根据需要使用。 现在,如果我们只使用 n1
数字
$x1
, 我们必须至少使用至少减去配置 / n1 + 1/ 数字 $x1 / 什么是实际的方式 [ v - /n1 + 1/x1 ] /. 而且 , 如果我们只使用 n2 数字 $x2, 我们还必须扣除方式 [ v - /n2 + 1/x2 ] 和
T. D。
现在我们两次至少减去了至少一个配置 /
n1
+ 1/
$x1
和 /
n2
+ 1/
$x2
, 因此,我们需要添加
方法
[
v -/n1 + 1/x1 - /n2 + 1/x2
] 等等。
特别是,如果
N
= 一组配置,所有硬币尽可能多地使用,
AI.
= 至少有一组配置
我们
+ 1 数字 $xi 用过的
为了 1 <=
一世
<=
m
, 然后
结果,我们努力 = |
N
| - |
A1
| - |
A2
| .. - |
是
| + |
A1和A2
| + |
A1 和 A3
| +
... - |
A1 和 A2
和
A3
| .....
计算具有无限数量硬币的配置数量的代码实际上更容易:
</count;i++>
假设你有 3 $1-coins, 2
$2-coins, 3 $5-coins, 1 $10-coin,
有 4 时尚得到 $10 的
这些硬币。 如果有 n1 $X1
硬币 n2 $X2 硬币 ... nm $Xm 硬币
我们可以获得多少种方式 $X 的
它是有限数量的硬币吗?
如果我们创造了很多 { X1, X1..... X1, X2, X2.......... X2, ..., ..., ............, 嗯,嗯...... Xm}, 然后,当然,我们可以实现它的子集的总和 $X.
但我找不到方法使用套装 {n1, n2, n3.... nm} , {X1, X2, X3.... Xm}.
我的朋友告诉我,这是一种问题背包,但我不知道该怎么做。
这是我写的部分代码 :
ways[0]=1, mylim=0;
for/i=0;i<count;i++ else="" for="" if="" j="" mylim="LIMIT;" mylim+="coins[i];" mylim+coins[i]<="LIMIT/" {="">=coins[i];j--/{
ways[j]=/ways[j]+ways[j-coins[i]]/%MOD;
}
}
如果你如此善良,我会非常好看,并更多地解释了一下。
EDIT
:
这个问题更适合 stackexchange for computer science, 但由于这是我的旧问题,我宁愿在这里编辑它。
可以使用原理来解决这个问题
不包括纳入
, 这很方便,
当我们有固定的硬币时,但每个硬币的金额随着每个请求而变化
.
认为
什么
方法[v] - 这种创造方式
$v
从
$x1
,
$x2
, ..
$xm
, 每个都根据需要使用。 现在,如果我们只使用 n1
数字
$x1
, 我们必须至少使用至少减去配置 / n1 + 1/ 数字 $x1 / 什么是实际的方式 [ v - /n1 + 1/x1 ] /. 而且 , 如果我们只使用 n2 数字 $x2, 我们还必须扣除方式 [ v - /n2 + 1/x2 ] 和
T. D。
现在我们两次至少减去了至少一个配置 /
n1
+ 1/
$x1
和 /
n2
+ 1/
$x2
, 因此,我们需要添加
方法
[
v -/n1 + 1/x1 - /n2 + 1/x2
] 等等。
特别是,如果
N
= 一组配置,所有硬币尽可能多地使用,
AI.
= 至少有一组配置
我们
+ 1 数字 $xi 用过的
为了 1 <=
一世
<=
m
, 然后
结果,我们努力 = |
N
| - |
A1
| - |
A2
| .. - |
是
| + |
A1和A2
| + |
A1 和 A3
| +
... - |
A1 和 A2
和
A3
| .....
计算具有无限数量硬币的配置数量的代码实际上更容易:
ways[0]=1;
for/ int i = 0 ; i < count ; i++/{
for/ int j = coins[i] ; j < ways.size// ; j++ /{
ways[j] += ways[j-coins[i]];
}
}
</count;i++>
没有找到相关结果
已邀请:
2 个回复
快网
赞同来自:
-这是
.
让我们
ways[j] = number of ways of obtaining sum j
.
你可以计算它 /这就是你所做的,但我不知道为什么你打电话给我们的变量
/.
这意味着您使用每个硬币故障。
只有一次。 但是,您可以添加另一个循环来使用它至少一次,不再使用它
时间:
您仍然可以应用您的模块并计算您的限制,我为简单留下了它们。
三叔
赞同来自:
你可以了解一下。
http://mathworld.wolfram.com/CoinProblem.html