思路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;
}
买书问题的两种算法解决方法
本文介绍了通过两种不同的动态规划方法解决买书问题的过程。一种方法将问题视为简单的整数划分问题,并使用二维动态规划数组进行求解;另一种方法则将其转化为完全背包问题,利用一维动态规划数组来计算所有可能的购买方案数量。
876

被折叠的 条评论
为什么被折叠?



