题目描述

母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统。由于它们特殊的思考方式,它们对货币的数值感到好奇。

传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单位面值组成的。

母牛想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值。

举例来说, 使用一个货币系统 {1,2,5,10,...}产生 18单位面值的一些可能的方法是:18x1, 9x2, 8x2+2x1, 3x5+2+1,等等其它。 写一个程序来计算有多少种方法用给定的货币系统来构造一定数量的面值。保证总数将会适合long long (C/C++) 和 Int64 (Free Pascal),即在0 到2^63-1之间。

输入输出格式

输入格式:

货币系统中货币的种类数目是 V (1<=V<=25)。要构造的数量钱是 N (1<= N<=10,000)。

第一行: 二个整数,V 和 N 。

第二行: 可用的货币的面值 。

输出格式:

输出格式:

单独的一行包含那个可能的用这v种硬币凑足n单位货币的方案数。

输入输出样例

输入样例#1: 复制

3 10
1 2 5
输出样例#1: 复制

10

说明

翻译来自NOCOW

USACO 2.3

求方案数类型完全背包

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 2147483647
const ll INF = 0x3f3f3f3f3f3f3f3fll;
#define ri register int
template <class T> inline T min(T a, T b, T c)
{
return min(min(a, b), c);
}
template <class T> inline T max(T a, T b, T c)
{
return max(max(a, b), c);
}
template <class T> inline T min(T a, T b, T c, T d)
{
return min(min(a, b), min(c, d));
}
template <class T> inline T max(T a, T b, T c, T d)
{
return max(max(a, b), max(c, d));
}
#define scanf1(x) scanf("%d", &x)
#define scanf2(x, y) scanf("%d%d", &x, &y)
#define scanf3(x, y, z) scanf("%d%d%d", &x, &y, &z)
#define scanf4(x, y, z, X) scanf("%d%d%d%d", &x, &y, &z, &X)
#define pi acos(-1)
#define me(x, y) memset(x, y, sizeof(x));
#define For(i, a, b) for (int i = a; i <= b; i++)
#define FFor(i, a, b) for (int i = a; i >= b; i--)
#define bug printf("***********\n");
#define mp make_pair
#define pb push_back
const int maxn = ;
// name*******************************
ll v,n;
ll a[maxn];
//int dp[maxn][maxn];
ll dp[maxn];
// function****************************** //***************************************
int main()
{
// ios::sync_with_stdio(0);
// cin.tie(0);
// freopen("test.txt", "r", stdin);
// freopen("outout.txt","w",stdout);
cin>>v>>n;
For(i,,v)
{
cin>>a[i];
} //一维优化
dp[]=;
For(i,,v)
{
FFor(j,n,)
{
for(int k=; j-k*a[i]>=; k++)//注意这里k要从1开始,从0开始的话就会重复
{
dp[j]+=dp[j-a[i]*k];
}
}
} cout<<dp[n]; //二维未优化
// For(i,0,v)dp[i][0]=1;
// For(i,1,v)
// {
// For(j,1,n)
// {
// for(int k=0; j-k*a[i]>=0; k++)
// {
// dp[i][j]+=dp[i-1][j-a[i]*k];
// cout<<"i:"<<i<<" j:"<<j<<" k:"<<k<<" dp:"<<dp[i][j]<<endl;
// }
// }
// }
// cout<<dp[v][n]; return ;
}

最新文章

  1. 通过pycharm使用git[图文详解]
  2. 块级标签包含行内标签底部出现3px间隔的解决办法
  3. EF多对多更新报错(TableNoTracking引发的bug)
  4. angular学习之关于ng-class详解
  5. 使用rem来开发你的移动端网站
  6. IEnumerable 和 IQueryable 区别
  7. EassyUI内置方法与属性
  8. Request 分别获取具有相同 name 属性表单元素值
  9. 分享非常有用的Java程序 (关键代码) (二)---列出文件和目录
  10. Android如何使用API
  11. Three.js学习笔记01
  12. Flask —— 信号(5)
  13. BUAAOO-First-Summary
  14. 架构 规则引擎 quartz
  15. 前端框架VUE----计算属性和侦听器
  16. Paramiko&amp;堡垒机
  17. hbase经常使用的shell命令样例
  18. 大型运输行业实战_day02_1_数据库设计与powerDesigner使用
  19. 彻底弄懂JS的事件冒泡和事件捕获(不推荐阅读)
  20. [Android Pro] 有关Broadcast作为内部类时注册的一些问题

热门文章

  1. 【PyQt5 学习记录】010:QSplitter
  2. FineReport软件
  3. Dynamics 365Online 查询Web Api的请求WebUri
  4. Android组件系列----当前Activity跳转到另一个Activity的详细过程
  5. C# 希尔排序
  6. 也许,这样理解HTTPS更容易
  7. Linux grep/egrep命令详解
  8. 转贴:C语言链表基本操作
  9. 【跨域】#001 JSONP原理解析【总结】
  10. Windows10 1709正式版WSL安装(以Ubuntu为例)