挑戰程式設計競賽 部分和問題

2021-09-24 17:11:18 字數 1275 閱讀 2977

(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 並按輸入順序依次...