1. 程式人生 > >[P1441]砝碼稱重 (搜尋+DP)

[P1441]砝碼稱重 (搜尋+DP)

對於我這種蒟蒻,是很不錯的一題了。

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; }