题目链接:
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1101
题解:
一道完全背包的问题。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
const int maxn =1e5+10;
const int mod = 1e9+7;
int num[13]={1,2,5,10,20,50,100,200,500,1000,2000,5000,10000};
int dp[maxn];
//dp直接存储满足条件的次数
int main()
{
int n;
scanf("%d",&n);
met(dp,0);
dp[0]=1;
for(int i=0;i<13;i++)
// 可以进行选择的种类
{
for(int j=num[i];j<=n;j++)
// 背包的容量的大小
{
dp[j]=(dp[j]+dp[j-num[i]])%mod;
// 这里题目要求的是满足条件的所有的次数。
}
}
// for(int i=1;i<=n;i++)
// printf("%d %d\n",i,dp[i]);
printf("%d\n",dp[n]);
}