// A Dynamic programming based C++ program to find number of
// non-negative solutions for a given linear equation
#include<bits/stdc++.h>
using namespace std;
// Returns counr of solutions for given rhs and coefficients
// coeff[0..n-1]
int countSol(int coeff[], int n, int rhs)
{
// Create and initialize a table to store results of
// subproblems
int dp[rhs+1];
memset(dp, 0, sizeof(dp));
dp[0] = 1;
// Fill table in bottom up manner
for (int i=0; i<n; i++)
for (int j=coeff[i]; j<=rhs; j++)
dp[j] += dp[j-coeff[i]];
return dp[rhs];
}
// Driver program
int main()
{
int coeff[] = {2, 2, 5};
int rhs = 4;
int n = sizeof(coeff)/sizeof(coeff[0]);
cout << countSol(coeff, n, rhs);
return 0;
}
我是竞争性编程的新手,我只是偶然发现了这段代码。我想知道这个特定片段背后的直觉,比如第二个{{1}}循环如何帮助。谢谢。
for
这是采用自下而上的方法,而且
假设 // Fill table in bottom up manner
for (int i=0; i<n; i++)
for (int j=coeff[i]; j<=rhs; j++)
dp[j] += dp[j-coeff[i]];
和j= 3
那么j-coeff[i] = 2
如何给出解决方案?如何简单地添加先前结果和当前结果可以得到线性变量的整体解?
答案 0 :(得分:1)
想象一下,你有无限数量的金币价值2,3,5(你的coeff[]
),你想知道一些解决方案的数量,以便给出一些总和形式的硬币。
在第一次循环运行中,您将用硬币填充表格2.表格将被填充
idx 0 1 2 3 4 5 6
num 1 0 1 0 1 0 1
因为有唯一的方法来获得这些硬币的总和。
在第二轮循环中,你用硬币3填充表格 - 现在你将有可能由硬币2和3组成的总和
idx 0 1 2 3 4 5 6
num 1 0 1 1 1 1 2
请注意,单元格5填充2 + 3 - 类似于您的问题情况,单元格6现在包含2个变体:2 + 2 + 2和3 + 3