1273:【例9.17】货币系统
【题目描述】
给你一个n种面值的货币系统,求组成面值为m的货币有多少种方案。
【输入】
第一行为n和m。
【输出】
一行,方案数。
【输入样例】
3 10 //3种面值组成面值为10的方案
1 //面值1
2 //面值2
5 //面值5
【输出样例】
10 //有10种方案
二维解法
一开始只有70分,搞了一上午也不知道哪里错了
之后看别人的题解
竟然是dp数组要用long!!!
how dare you!!!
#include <bits/stdc++.h>
using namespace std;
int m,n;
int w[1010];
long dp[110][10010];
int main()
{
cin>>n>>m;
//面值为m,也就是背包容量是m
for(int i=1; i<=n; i++)
{
//输入每个货币的面值,也就是重量
cin>>w[i];
}
// 背包容量为0时的dp应该设置为1
for(int i=0; i<=n; i++)
{
dp[i][0]=1;
}
for(int i=1; i<=n; i++)
{
for(int j=0; j<=m; j++)
{
if(w[i]<=j) dp[i][j]=dp[i-1][j]+dp[i][j-w[i]];
else
{
dp[i][j]=dp[i-1][j];
}
}
}
cout<<dp[n][m];
return 0;
}
一维解法可以满分过
#include<bits/stdc++.h>
using namespace std;
int m,n;
int a[1001];
long long f[10001];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
f[0]=1;
for(int i=1;i<=m;i++){
f[i]=0;
}
for(int i=1;i<=n;i++)
for(int j=a[i];j<=m;j++){
f[j]+=f[j-a[i]];
}
cout<<f[m];
return 0;
}