首页 新闻 搜索 专区 学院

一道算法题,求用背包问题解决

0
悬赏园豆:200 [待解决问题]

给定一个非负整数序列 x1, x2, …, xn,可以给每一个整数取负数或者取原值, 求有多少种取法使得这些整数的和等于期望值 E。

例子: 输入:非负整数序列为 1, 1, 1, 1, 1,期望值 E 为 3 输出 :5

5 种取法分别为:

-1+1+1+1+1 = 3

1-1+1+1+1 = 3

1+1-1+1+1 = 3

1+1+1-1+1 = 3

1+1+1+1-1 =3

张方琛的主页 张方琛 | 初学一级 | 园豆:4
提问于:2021-04-01 00:02
< >
分享
所有回答(2)
0

这个恐怕只能dfs了

汉森伯逸 | 园豆:204 (菜鸟二级) | 2021-04-20 12:48
0
  1. 如果将等式左边的负值移到右边,等式两边仍然相等。等式左边的值加上等式右边的值等于非负序列的和加上期望的值。那么就可以有一个结论,如果非负序列的和+期望不是偶数的话,就一定没有符合题意的取法。如果期望值大于非负序列的和,也没有符合题意得取法。
    2.(非负序列的和+期望)/ 2 等于每个取法中 取原值的和。
    3.如果令(非负序列的和+期望)/ 2 = k,那么就可以转化为:将体积为k的01背包装满,有几种装法。其中如果不选择某个物品,实际上相当于某个整数取了负值。
    4.那么只需要将01背包问题的状态转移方程中的max ,变为sum即可。即dp[i][j] = d[i-1][j] +dp[i-1][j-num[i]] ,其中 dp[i-1][j]表示不装,也就是选择了负值,dp[i-1][j-num[i]] 表示装,也就是选择了原值。
    5.在经过滚动数组优化,状态转移方程就变成了dp[j]=dp[j]+dp[j-num[i]].
张方琛 | 园豆:4 (初学一级) | 2021-04-20 12:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册