博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】1708: [Usaco2007 Oct]Money奶牛的硬币
阅读量:7123 次
发布时间:2019-06-28

本文共 927 字,大约阅读时间需要 3 分钟。

【算法】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
#include
#include
#define ll long longusing namespace std;const int maxn=10010,maxV=30;int n,m,a[maxV];ll f[maxn][maxV];int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]); f[0][0]=1; for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++)if(i-a[j]>=0){ for(int k=0;k<=j;k++)f[i][j]+=f[i-a[j]][k]; } } ll ans=0; for(int i=0;i<=n;i++)ans+=f[m][i]; printf("%lld",ans); return 0;}
View Code

------------------------------------------------------

以上脑洞太大了,其实是完全背包。

每个面值视为物品体积,求总体积为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]];

转载于:https://www.cnblogs.com/onioncyc/p/7453720.html

你可能感兴趣的文章
聊聊json
查看>>
【更新】FusionCharts图表库 v3.10.0发布|附下载
查看>>
TensorFlow实战之K-Means聚类算法实践
查看>>
verify.js 极简表单校验插件
查看>>
调查显示,大多数 Java 开发人员不希望学习新语言
查看>>
华为诉美国政府案新进展,法院已发传票
查看>>
小米成立AIoT战略委员会,加速落地All in AIoT战略 ...
查看>>
全栈必备 JavaScript基础
查看>>
soamanager将RFC类型的FM发布成web service
查看>>
兰晟生物医药完成数千万元A轮融资,引领神经精神疾病创新药物的快速发展 ...
查看>>
中国 HBase 技术社区 2019 年全国 meetup 计划
查看>>
书籍:Learn Web Development with Python - 2018.pdf
查看>>
C++雾中风景13:volatile解惑
查看>>
使用Ceph集群作为Kubernetes的动态分配持久化存储
查看>>
SAP权限对象的校验
查看>>
# 关于“态势感知”产品活动体验
查看>>
《语义Web编程》一导读
查看>>
Django 模板
查看>>
JavaWeb实训项目案例开发之在线图书网站开发【非常适合初学者】
查看>>
Apache Flink 漫谈系列(08) - SQL概览
查看>>