(1): 這道題的揹包思想:
(2): 這道題的深度優先搜尋思想:
複雜度:2
比較,很明顯,對這道題,深度優先搜尋更佔優勢。
#include#includeusing namespace std;
const int offset = 1000;
const int maxn = 21;
const int maxm = maxn * 2 * offset + 5;
int dp[2][maxm];
int a[maxn];
int main()
cin >> k;
memset(dp, 0, sizeof(dp));
dp[0][0+offset] = 1;
for(int i=1; i<=n; i++)
}if(dp[n%2][k+offset])
cout << "yes" << endl;
else
cout << "no" << endl;}}
#includeusing namespace std;
const int maxm = 21;
int a[maxm];
int sum;
int k;
int n;
int flag;
void dfs(int deep)
// 該節點和等於k
if(sum == k)
// 不選該數
dfs(deep+1);
if(flag)
return
// 選該數
sum += a[deep];
dfs(deep+1);
if(flag)
return;
sum -= a[deep];
return;
}int main()
return 0;
}
挑戰程式設計競賽 多重部分和問題
就類似完全揹包。不過要恰好等於揹包容量。就是給n種數ai,各mi個,判斷是否能從這些數字中選出若干個使他們的和為v。用dp求解,dp i 1 j 表示前i種數字能否加和得到j。dp i 1 j 只要dp i j k ai 有乙個為真那麼就為真。0 k mi include include inclu...
《挑戰程式設計競賽(六)》DP解法 多重部分和問題
題目如上所示 按著前面題目的思路,完成如下 關鍵思路是遞推式要不斷取或 按照書上的習慣,先把輸入條件標出來,然後寫solve函式,這樣比較清爽 include include using namespace std define max n 100 define max k 100000 int n...
部分和問題
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 給定整數a1 a2 an,判斷是否可以從中選出若干數,使它們的和恰好為k。輸入 首先,n和k,n表示數的個數,k表示數的和。接著一行n個數。1 n 20,保證不超int範圍 輸出如果和恰好可以為k,輸出 yes 並按輸入順序依次...