Arithmetic problem | Target Sum

题目如下:

You are given a list of non-negative integers, a1, a2, …, an, and a target, S. Now you have 2 symbols + and -. For each integer, you should choose one from + and - as its new symbol.

Find out how many ways to assign symbols to make sum of integers equal to target S.

Example 1:
Input: nums is [1, 1, 1, 1, 1], S is 3.
Output: 5
Explanation:

-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

There are 5 ways to assign symbols to make the sum of nums be target 3.

解题思路:
这题目有一定难度。。。不过由于是数列的数都要使用,那么选了当正数的数出来,剩下的数也就是代表负数了。先合理抽象问题,假设S(r)为在数列里充当正数的数的累计和,S(l)为剩下的数的累计和,那么根据题意容易得到S(r)-S(l)=target。

然而,两个未知数可确定不了解,还有什么可以补充的?那就是数列所有数的和嘛。。。抽象为S(a),意为数列所有数的累计和,得到S(r)+S(l)=S(a)。

两条式子相加,得到S(r)+S(r)=target+S(a)。那么S(r)=(target+S(a))/2。现在的问题完美演变成“从数列里找出n个数的累计和等于(target+S(a))/2”了。由于数列内都为正整数,所以(target+S(a))/2也必须为正数,可得target+S(a)也不会是奇数。

好了,继续抽象这个问题,假设B(n,k)为在前n个数内抽出某些数的累计和为k,从减少规模的情况来看,设n个数最后一个数p一定选中,那么前面部分的数据就需要抽出某些数的累计和等于k-p了,因此得到B(n,k)=B(n-1,k-p)。

至此,低规模数据递推成n规模数据即可。

解题思路代码:

int Method(int *n,int len,int target)
{
    int *matrix=new int[len+1];
    ZeroMemory(matrix,len*4+4);
    int aspt=accumulate(n,n+len,0)+target;
    if(aspt&1||len<=0) return 0;
    target=aspt/2;
    matrix[0]=1;

    for(int i=0;i<len;++i)
        for(int p=target;p>=n[i];--p)
        {
            matrix[p]+=matrix[p-n[i]];
        }

    int res=matrix[target];
    delete[] matrix;
    return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值