全wa,思路貌似没啥问题啊

P1441 砝码称重

``` #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 2010; const int maxm = 30; int n, m, a[maxm], ans; bool f[maxn]; bool vis[maxm]; void dfs(int k,int last)//k表示取了多少个 { if (k == m + 1)//拿走了m个,必须制裁 { memset(f, 0, sizeof(f)); f[0] = 1; for (int i = 1; i <= n; i++) if (!vis[i])//没被拿走 for (int j = 2000; j >= 0; j--) if(j + a[i] <= 2000)//太大了可不行 f[j + a[i]] = f[j+a[i]]|f[j];//嘎嘎标记 int num = 0; for (int i = 1; i <= 2000; i++) num += f[i]; ans = max(ans, num); return; } for (int i = last + 1; i <= n; i++) { vis[i] = 1;//标记为拿走了 dfs(k + 1, i); vis[i] = 0;//回首掏 } } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); dfs(1, 0); cout << ans; } ``` 已A代码,改了“嘎嘎标记”那一行。 不能直接等于,因为```f[j+a[i]]```可能本来是1,目前找到的这种方法可能不行,但还是可以组成``j+a[i]``这个数。 ~~注:别问我是怎么知道的,我也掉坑里了[哭] · · · · · ·~~
by doris_xyb @ 2023-02-04 20:00:22


|