[P1441]砝碼稱重 (搜尋+DP)
阿新 • • 發佈:2018-11-09
對於我這種蒟蒻,是很不錯的一題了。
dfs搜尋當前狀態
滿足時DP
比較坑的地方就是起始的地方
我一開始從1開始,搜尋寫的是從0開始。
後來就統一用0開始的了。
#include<bits/stdc++.h> #define max(a,b) (a>b?a:b) using namespace std; int n, m; int a[25],ans; bool f[2005]; bool vis[25]; void dp()//揹包 滾存優化是看一個大佬的題解的 { memset(f, 0, sizeof f); f[0] = true;int ret = 0, tot = 0; for (int i = 0; i < n; i++) { if (vis[i]) continue; for (int j = tot; j >= 0; j--)if (f[j] && !f[j + a[i]]) f[j + a[i]] = true, ret++; tot += a[i]; } ans = max(ans, ret); } void dfs(int x,int y)//搜尋 { if (y > m) return; if (x > n) return; if (x == n && y==m) { dp();//滿足的時候DP return; } dfs(x + 1, y); vis[x] = true; dfs(x+1, y + 1); vis[x] = false; return; } int main() { memset(vis, 0, sizeof(vis)); scanf("%d%d", &n, &m); for(int i = 0; i < n; i++) { scanf("%d", &a[i]); } dfs(0,0); printf("%d", ans); return 0; }