思路1:类似简单的整数划分问题,把n个整数划分为4个固定的整数
#include<iostream>
#include<string.h>
using namespace std;
int dp[1001][101],a[101]={0,10,20,50,100};
int main()
{
int n,i,j;
cin>>n;
if(n%10!=0)
{
cout<<0<<endl;
return 0;
}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for (i=10;i<=n;i+=10)//遍历钱数
for (j=1;j<=4;j++)//遍历物品
{
if (a[j]<i)
dp[i][j]=dp[i-a[j]][j]+dp[i][j-1];
else if (a[j]==i)
dp[i][j]=dp[i][j-1]+1;
else
dp[i][j]=dp[i][j-1];
}
cout<<dp[n][4]<<endl;
return 0;
}
思路2:由于先判断了n%10,所以无论怎么买,n总能全部花完。变成完全背包问题求方案总数
#include<iostream>
#include<string.h>
using namespace std;
int dp[1001],a[101]={0,10,20,50,100};
int main()
{
int n,i,j;
cin>>n;
if(n%10!=0)
{
cout<<0<<endl;
return 0;
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for (i=1;i<=4;i++)
for (j=0;j<=n;j++)
if (a[i]<=j && dp[j-a[i]]>=0)
dp[j]+=dp[j-a[i]];
cout<<dp[n]<<endl;
return 0;
}