总时间限制: 1000ms 内存限制: 65536kB
描述
小明手里有n元钱全部用来买书,书的价格为10元,20元,50元,100元。
问小明有多少种买书方案?(每种书可购买多本)
输入
一个整数 n,代表总共钱数。(0 <= n <= 1000)
输出
一个整数,代表选择方案种数
样例输入1:
20
样例输入2:
15
样例输入3:
0
样例输出1:
2
样例输出2:
0
样例输出3:
0
动态规划思路
因为会有重复不能使用类似这种算法
for(int i=0;i<=n;i++){
f[i+1]+=f[i];
f[i+2]+=f[i];
f[i+5]+=f[i];
f[i+10]+=f[i];
}
所以去重,一种一种买书种类处理
#include<cstdio>
#include<cstdio>
#include<iostream>
using namespace std;
#define N 105
int n,ans;int a[6]={0,1,2,5,10},f[N];
int main(){
scanf("%d",&n);
if(!n||n%10) {printf("0");return 0;}
n/=10;f[0]=1;
for(int k=1;k<=4;k++){
for(int i=0;i<=n;i++){
if(i>=a[k]){
f[i]+=f[i-a[k]];
}
}
}
printf("%d",f[n]);
return 0;
}
此题DP没想出来,2333333
#include<cstdio>
#include<iostream>
using namespace std;
#define N 1005
int n,ans;
int main(){
scanf("%d",&n);
if(!n||n%10) {printf("0");return 0;}
n/=10;
for(int i=0;i<=n;i++){
for(int j=0;j*2<=n;j++){
for(int p=0;p*5<=n;p++){
for(int q=0;q*10<=n;q++){
if(i+j*2+p*5+q*10==n) ans++;
}
}
}
}
/* for(int i=0;i<=n;i++){
f[i+1]+=f[i];
f[i+2]+=f[i];
f[i+5]+=f[i];
f[i+10]+=f[i];
}*/
printf("%d",ans);
return 0;
}