多重部分和问题
描述:
N種不同數字ai每種mi個,判斷是否可以選擇若干個使得和為K
N<=100,k<=100000,ai,mi<=100000,均大于零。
分析:
裸算法:
DP[I][K]=0..1——前i個物品是否可以組成K
for (int i=1;i<=n;i++)
for (int k=0;k<=K;k++)
if (Dp[i-1][k])
for (int c=0;c<=mi;c++)
Dp[i][k+c*ai]=1;
時間復雜度顯然是n*k*mi sum i=1..n 十分巨大
因為如果使用DP求BOOL往往很浪費,放棄了許多可以利用的信息。
如果我們不僅僅求出能否得到目標,并且記錄下來剩下來多少個,可以減小很大的復雜度。
改為DP[I][K]為前I組成K,第I可以剩下最多為多少。
for (int i=1;i<=n;i++)
for (int k=0;k<=K;k++)
if (k>=ai)
{
if (Dp[i-1][k])
{
//上一個已經可以構成
Dp[i][k]=mi;
}
if (Dp[i][k-ai])
{
//如果DP[I][K]可以構成,那么DP[I][K-AI]是必然可以構成的
Dp[i][k]=Dp[i][k-ai]-1;
}
}
else
{
Dp[i][k]=-1;
}
轉載于:https://www.cnblogs.com/dandi/p/3949929.html
總結
- 上一篇: STL标准容器类简介
- 下一篇: HBase图文详解