【BZOJ】1708: [Usaco2007 Oct]Money奶牛的硬币
2024-10-21 11:38:22
【算法】DP
【题解】
如果每个排列算一种,则令f[i]表示凑成面值为i的方案数,容易推出f[i]+=f[i-a[j]]。
现在是每个组合才算一种,令f[i][j]第二维表示只使用前j种面值,f[i][j]+=f[i-a[j][k],k=0~j,这样最终算出来的方案就是按一定顺序的,不会重复计算。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=,maxV=;
int n,m,a[maxV];
ll f[maxn][maxV];
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
f[][]=;
for(int i=;i<=m;i++){
for(int j=;j<=n;j++)if(i-a[j]>=){
for(int k=;k<=j;k++)f[i][j]+=f[i-a[j]][k];
}
}
ll ans=;
for(int i=;i<=n;i++)ans+=f[m][i];
printf("%lld",ans);
return ;
}
------------------------------------------------------
以上脑洞太大了,其实是完全背包。
每个面值视为物品体积,求总体积为N的方案数。
换种思路,每次考虑加入一种面值,这样就自然不会重复算了。
f[0]=1;
for(int i=1;i<=v;i++)
for(int j=a[i];j<=n;j++)
f[j]+=f[j-a[i]];
最新文章
- css面包屑导航编号
- Atitit org.eclipse.jdt&#160;的ast 架构 Eclipse JDT API&#160;spec
- CentOS常用指令
- Oracle如何操作级联删除
- 亲测linux6.4 安装
- java中jvm的工作原理
- SPRING 配置文件和类名
- CSS 中的内联元素、块级元素、display的各个属性的特点
- centos 7 下面安装oracle 11g r2 过程分享
- Apache Spark 2.2.0 中文文档 - 概述 | ApacheCN
- 关于Swing窗体有时候要放大缩小边框才能显示问题?
- weblogic 服务器部署SSL证书
- z-index的权重是叠加的
- layui学习
- Windows android SDK环境配置及判断安装成功
- 【转】实习小记-python 内置函数__eq__函数引发的探索
- LeetCode 633. 平方数之和
- C#程序证书创建工具 (Makecert.exe)
- poj3417Network【LCA】【树形DP】
- Golang 类型转换整理