P6205 [USACO06JAN] Dollar Dayz S 完全背包 计数型
题意:
yao去商场买东西,有k种东西,东西的价格分别为1,2,……k,yao手里有N元,必须全部花完,他有多少种购买方式呢
分析:
这个题相当于说是每个东西的价钱都告诉你了,然后可以买无限次一个东西,那么我们很自然的想到完全背包,相当于说是我们之前选了j-i元的东西的方案+买了一个价值为i的物品的方案,所以转移方程就很好想f [j ] += f [ j – I ];
同时要注意,这里的数字超级大,爆longlong 所以要用__int128 编写快读快写
代码:
//快写
typedef __int128 ll;
ll f[1001];
int n, m;
int print(ll x) {//快写
if(x == 0) return putchar(48) + putchar(10);
if(x >= 10) print(x / 10);
putchar(x % 10 + 48);
}
--------------------------------------------------------------分割线
f[0]=1;//初始化!让n为0时的方案数为1
for(int i=1;i<=k;i++)//枚举每一个物品
{
for(int j=i;j<=n;j++)//必须大于i,否则买不了/kk
{
f[j]+=f[j-i];//那么这个方案数就是上面所推导的一坨
}