描述
输入
一个整数 n,代表总共钱数。(0 <= n <= 1000)
输出
一个整数,代表选择方案种数
样例输入
样例输出
小明手里有n元钱全部用来买书,书的价格为10元,20元,50
问小明有多少种买书方案?(每种书可购买多本)
样例输入1:20样例输入2:15样例输入3:0
样例输出1:2样例输出2:0样例输出3:0
买书
明显的完全背包问题,所有的钱都用来买书,就是正好花完,且书的数量不限。用m[j]存储j元时的方案,p[i]存储价格。
双重循环,价格和价钱,如果钱不够了,则返回m[j]=m[j-p[i]],如果够,则m[j]+=m[j-p[i]]。
明显的完全背包问题,所有的钱都用来买书,就是正好花完,且书的数量不限。用m[j]存储j元时的方案,p[i]存储价格。
双重循环,价格和价钱,如果钱不够了,则返回m[j]=m[j-p[i]],如果够,则m[j]+=m[j-p[i]]。
#include <iostream>
#include<string.h>
using namespace std;
int main()
{
int n,m[1100],i,j;
int p[5]={10,20,50,100};
while(cin>>n)
{
memset(m,-1,sizeof(m));
m[0]=1;
for(i=0;i<4;i++)
for(j=0;j<=n;j++)
{
if(j-p[i]>=0)
{
if(m[j]<0)
m[j]=m[j-p[i]];
else
m[j]+=m[j-p[i]];
}
}
if(m[n]<0)
cout<<"0"<<endl;
else
cout<<m[n]<<endl;
}
return 0;
}