[Luogu] P1441 砝码称重
题目描述
现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0)。
题目分析
因为读错题WAWA大哭。
先dfs枚举选的砝码,满足条件时进行dp来求出当前的解的数量。
Code
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 20 + 5; int n,m; int a[MAXN],dp[50000]; int ans; bool skip[MAXN]; void __dp(void) { int tmp = 0, tot = 0; memset(dp,0,sizeof(dp)); dp[0] = true; for(int i = 0;i < n;i++) { if(skip[i]) continue; for(int j = tot;j>=0;j--) { if(dp[j] && !dp[j+a[i]]) dp[j+a[i]] = true,tmp++; } tot += a[i]; } ans = max(tmp,ans); return; } void dfs(int x,int y) { if(y > m) return; if(x == n) { if(y == m) __dp(); return; } dfs(x+1,y); skip[x] = true; dfs(x+1,y+1); skip[x] = false; return; } //3 1 //1 2 2 int main() { scanf("%d%d",&n,&m); for(int i = 0;i < n;i++) { scanf("%d",&a[i]); } dfs(0,0); printf("%d\n",ans); return 0; }
所有博文均为原创 转载请留言征得博主同意