第31题
这一题求200可以由1,2,5,10,20,50,100,200以多少种不同的方式相加而成。
将硬币分别标记为f[1]=1;f[2]=2;f[3]=5;f[4]=10;f[5]=20;f[6]=50;f[7]=100];f[8]=200;
使用 dp[i][j] 表示利用最大面额为f[j]的纸币组成i有多少种方法。
转移就是 dp[i][j]+=∑jk=1dp[i−f[j]][k]
#include<bits/stdc++.h>
using namespace std;
int dp[210][10];
int coin[10]={
0,1,2,5,10,20,50,100,200,1000};
int main(){
int n=200;dp[0][1]=1;
for (int i=1;i<=200;i++){
for (int j=1;coin[j]<=i;j++){
for (int k=1;k<=j;k++){
dp[i][j]+=dp[i-coin[j]][k];
}
}
}
for (int i=1;i<=10;i++) dp[200][0]+=dp[200][i];
cout<<dp[200][0]<<endl;
return 0;
}
第32题
这个题要求寻找所有满足条件的数的和。条件为:将数x表示为 x=a∗b</