题目描述:农夫约翰有N元钱,市场上有价值1……K的商品无限个,求所有的花钱方案
题解:很明显的无限背包,定义dp[i][j]表示用前i个价值的商品花费j元,则有dp[i]
[j] = dp[i – 1][j] + dp[i][j – i]
参考程序:
#include<cstdio>
#include<iostream>
#define Limit 100000000000000000
using namespace std;
unsigned long long f[1010][2];
int main(){
int n,m;
scanf("%d %d",&m,&n);
f[0][1]=1;
for (int i=1;i<=n;i++){
for (int j=i;j<=m;j++){
f[j][0]+=f[j-i][0];
f[j][1]+=f[j-i][1];
f[j][0]+=f[j][1]/Limit;
f[j][1]%=Limit;
}
}
if (f[m][0])cout<<f[m][0];
cout<<f[m][1];
return 0;
}