有限背包计数问题
题意:
有一个大小为
两种方案不同,当且仅当存在至少一个数
Solution:
首先考虑一个朴素的背包,设
得到了一个
发现当物品的编号大于
对于编号小于等于
对于编号大于
回顾完全背包的做法,设
它的转移运用到了一种思想:一个序列
得到方程 ;
期中
最后设
答案即为
cin >> n;
B = sqrt(n);
dp[0][0] = 1;
for(int i = 1; i <= B; i ++) {
for(int j = 0; j < i; j ++) s[j] = 0;
for(int j = 0; j <= n; j ++) {
int t = j % i;
s[t] = s[t] + dp[i - 1][j];
dp[i][j] = s[t];
if(j >= i * i) s[t] = s[t] - dp[i - 1][j - i * i];
}
}
for(int i = 0; i <= n; i ++) f[i] = dp[B][i];
memset(dp, 0, sizeof dp);
dp[0][0] = 1;
for(int i = 1; i <= B; i ++)
for(int j = 0; j <= n; j ++) {
if(j >= i) dp[i][j] = dp[i][j] + dp[i][j - i];
if(j >= B + 1) dp[i][j] = dp[i][j] + dp[i - 1][j - B - 1];
g[j] = g[j] + dp[i][j];
}
g[0] = 1;
Z ans = 0;
for(int i = 0; i <= n; i ++)
ans = ans + f[i] * g[n - i];
cout << ans << '\n';
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现