给你五种硬币:1,5,10,25,50,现在给出一个n,求出用用这些组成价值n的种类数。(n<=250,硬币数量不超过100)
1)不完全解决方案(硬币数量无限制)
dp[i]:金额i对应的方案数
#include<bits/stdc++.h>
using namespace std;
const int N=251;
int a[5]={1,5,10,25,50};
int dp[N];
int main(){
int n;
dp[0]=1;
for(int i=0;i<5;i++)
for(int j=a[i];j<N;j++)
dp[j]+=dp[j-a[i]];
while(cin>>n)
cout<<dp[n]<<endl;
return 0;
}
2)解决方案
dp[i][j]:j个硬币实现金额i的方案数
#include<bits/stdc++.h>
using namespace std;
const int K=100,N=250;
int dp[N+1][K+1];
int a[5]={1,5,10,25,50};
int main(){
dp[0][0]=1;
for(int i=0;i<5;++i)
for(int j=1;j<=K;++j)
for(int k=a[i];k<=N;++k)
dp[k][j]+=dp[k-a[i]][j-1];
int ans[N+1]={0};
for(int i=0;i<=N;i++)
for(int j=0;j<=K;j++)
ans[i]+=dp[i][j];
int n;
while(cin>>n)
cout<<ans[n]<<endl;
return 0;
}