洛谷 P1164 小A点菜(动态规划)

https://www.luogu.com.cn/problem/P1164

题意:

有n个菜品、m元,每样菜价钱a[i]只能点一次,求把m元点完的不同菜品有多少种方案

思路:

类似01背包,只不过这里我们没有价值,且方案数是叠加的,但整体思路还是一样,用f[j]记录j元时的方案数。
现在我们来思考转移方程,即选i菜j元时的方案数等于什么?若i菜不点,则j元方案数等于前i-1的方案数,即f[j]不变;若点i菜,我们就可以在原来基础上加上f[j-a[i]]的方案数,即f[j]=f[j]+f[j-a[i]]
最后不要忘了边界条件:f[0]=1,没有触发到这个之前多少次叠加都是0。

代码:

#include 
using namespace std;
int a[102],f[40004],vis[40004];
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	f[0]=1;//边界 
	for(int i=1;i<=n;i++)
	{
		for(int j=m;j>=a[i];j--)
		f[j]+=f[j-a[i]];//花j元点完的方案数等于此时的加上点这个菜后到达的 
	}
	cout<<f[m]<<endl;
	return 0;
}

你可能感兴趣的:(习题)