多重部分和问题
问题描述:
问题分析:
假设数组中存在n个数字,要能够从这n个数字中拿出一部分数使得和为k,那么需要满足的是能够从n-1个数字中拿出一部分数使得和为k-m*a[n-1] (0<=m<=m[n-1]).
综上我们可以得到如下dp方程:
bool dp[i,j] : 表示从前i个数字中能否找出若干个数使其和为j。
dp[i,j]=dp[i-1,j-m*a[i-1]]==true 其中:(0<=m<=m[i-1])
private bool[,] Dp;
/// <summary>
/// 多重部分和问题
/// dp[i,j] 是否能从前i个数据中找出和为j的 值义域(true-1,false-0)
/// </summary>
/// <param name="k"></param>
/// <param name="a"></param>
/// <param name="m"></param>
/// <returns></returns>
public bool MultiplePartialSum(int k,int[] a,int[] m)
{
Dp = new bool[a.Length+1,k+1];
for (int i=1;i<=a.Length;i++)
{
for (int j=1;j<=k;j++)
{
for (int t=0;t<=m[i-1];t++)
{
int temp=j - t * a[i - 1];
if (temp == 0)
{
Dp[i, j] = true;
break;
}
if (temp < 0)
break;
for (int z=1;z<=i-1;z++)
{
if (Dp[z,temp])
{
Dp[i, j] = true;
}
}
}
}
}
return Dp[a.Length,k];
}