--- title: "数字组合" created: 2025-11-28 tags: - 算法 --- # 数字组合 ## 题目 [数字组合](https://www.acwing.com/problem/content/description/280/) ![[image-bd740573.png]] ## 思路分析 01背包的变形 这次我们集合的属性不再是max了 而是count ![[image-2e50140e.png]] ## 代码实现 dfs(tle) ```cpp #include using namespace std; #define endl '\n' using ll = long long; using ull = unsigned long long; using PII = pair; using Pll = pair; int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; const int inf = 0x3f3f3f3f; const int N=10010; int v[N]; int f[N][N]; int n,m; int cnt=0; void dfs(int u,int sum){ if(u>n){ if(sum==m) cnt++; return; } dfs(u+1,sum+v[u]); dfs(u+1,sum); } int main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>m; for(int i=1;i<=n;i++) cin>>v[i]; dfs(1,0); cout< using namespace std; const int N=110,M=10010; int v[N]; int f[N][M]; int n,m; int main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>v[i]; //从i个物品中选 且总价值等于0的方案数都是一个(什么都不选也是一种选法) for(int i=0;i=v[i]) f[i][j]+=f[i-1][j-v[i]]; } } cout< using namespace std; const int N=110,M=10010; int v[N]; int f[M]; int n,m; int main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>v[i]; f[0]=1; for(int i=1;i<=n;i++) for(int j=m;j>=v[i];j--) f[j]+=f[j-v[i]]; cout< using namespace std; const int M=10010; int f[M]; int n,m; int main() { cin>>n>>m; f[0]=1; for(int i=1;i<=n;i++){ int v;cin>>v; for(int j=m;j>=v;j--) f[j]+=f[j-v]; } cout<