题目描述
思路
多少种点菜方法,而且恰好把所有钱花完
最多等待一秒那个指的是运行时间
求有多少种点菜方法
第一眼看过去感觉像背包,因为他也有个钱数的限制,但又与普通的01背包不一样,f[i]表示体积不超过i的最大价值,这个是恰好,但求的属性也不一样
背包是求最大价值,这个是求金额为m的最大方案数,背包的恰好装满对这个不用考虑,因为求的属性不一样,这个最后输出的f[i]表示金额为i的方案数
这个题不是线性dp是因为,他有一个限制
代码
//01背包
//要把钱恰好花完,每个的价值都是1(即种类),多少种点菜方法
//f[i]表示钱数为i时的方案数(因为背包问题的i是体积为i时的价值),都是约数条件
//方案数是求和,背包问题是取最大值
signed main()
{
int v, m;
cin >> m >> v;
f[0] = 1;//方案数,没有的时候是1
for(int i= 1; i <= m; i++)
{
int vv;
cin >> vv;
for(int j = v; j >=vv; j--)
{
f[j] += f[j - vv] ;//f表示种类方法
}
}
cout<<f[v]<<endl;
return 0;
}
总结
借着这道题把背包问题是否“恰好装满”思考了一下,背包其实也有很多变形,比如说求方案数的这道题