取款
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交: 测试通过:
AC代码如下:
总提交: 测试通过:
描述
有一天小明来到一台神奇的取款机钱,取款机可以无限提供某些特定面额的货币,小明想知道他要取出x元共存在几种不同的方案(取出顺序的不一样认为是相同的方案,具体以样例为准)。
输入
第一行一个整数m,表示提供的货币整数,
第二行m个整数,表示具体面额
第三行一个整数x表示要取出的钱
输出
输出取出X元的方案数目,如:取出4元的三种方案分别为(2,2),(1,1,2),(1,1,1,1)。
样例输入
3
1 2 5
4
1 2 5
4
样例输出
3
完全背包。
完全背包。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define M 100005
using namespace std;
int main()
{
int m,x;
int i,j;
__int64 a[M],dp[M];
while(~scanf("%d",&m))
{
memset(dp,0,sizeof dp);
for(i=1;i<=m;i++)
scanf("%I64d",&a[i]);
scanf("%d",&x);
if(x==0)
{printf("0\n");continue;}
for(i=1,dp[0]=1;i<=m;i++)
{
for(j=a[i];j<=x;j++)
dp[j]+=dp[j-a[i]];
}
printf("%I64d\n",dp[x]);
}
return 0;
}