题意:
给你n 和 m ,一个大小为n 的数组k[]
每次可取多个数并得到多个数的异或和,求有多少种取法
解法:
设状态dp[id][now]表示前id个数中取多个数后异或和为now的方案数,
然后针对每个数进行 取与不取 暴力递归记忆化即可
#include<bits/stdc++.h> #define ll long long using namespace std; int t; int m,n; int a[50]; ll dp[50][1000006]; ll dfs(int id,int now) { if(id==n) { if(now>=m) return 1; else return 0; } if(dp[id][now]!=-1) return dp[id][now]; ll ans=dfs(id+1,now);; ans+=dfs(id+1,now^a[id]); dp[id][now]=ans; return ans; } int main() {id[] scanf("%d",&t) ; int tt=1; while(t--) { scanf("%d%d",&n,&m); for(int i=0;i<=n;i++) { for(int j=0;j<=1e6;j++) { dp[i][j]=-1; } } for(int i=0;i<n;i++) { scanf("%d",&a[i]); } printf("Case #%d: %lld\n",tt++,dfs(0,0)); } }
Happy Matt Friends DP记忆化
最新推荐文章于 2023-04-15 22:58:38 发布
本文介绍了一种使用动态规划解决特定组合计数问题的方法,即计算在给定数组中选取若干个数使得其异或和满足特定条件的方案数量。通过递归记忆化搜索实现高效计算。
2028

被折叠的 条评论
为什么被折叠?



