作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
// 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;
}
我是竞争性编程的新手,我只是偶然发现了这段代码。我想知道这个特定片段背后的直觉,比如第二个 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
那么 d[3] = d[3] + d[2]
是如何给出解的呢?以前的结果和当前结果的简单相加如何得出线性变量的总解?
最佳答案
想象一下,您有无限数量的硬币,其值为 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
关于algorithm - n 个变量的线性方程的解数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49124265/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!