P1164 小A点菜 动态规划

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

题解:

	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			d[i][j]=d[i-1][j];
			if(j>=a[i])
			d[i][j]+=d[i-1][j-a[i]];
		}
	}

一些需要注意的地方:

我们规定(初始化)f[i][0] =1,也就是从前i份菜中恰好花0元的选法为1.

因为,如果a[i]恰好等于j时, j-a[i]恰好为0,d[i-1][j-a[i]]为0,相当于没加,但其实有仅选a[i]这一种选法没有加上,初始化为1可以让代码更简洁.不初始化的话,可以改成

	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(j==a[i])
			{
				d[i][j]=d[i-1][j]+1;
			}
			else
			{
				d[i][j]=d[i-1][j];
				if(j>a[i])
				d[i][j]+=d[i-1][j-a[i]];
			}
		}
	}

完整代码献上

#include<stdio.h>
#include<iostream>
#include<cstdlib>
#include<string.h>
#include<algorithm>
using namespace std;
const int M=10010;
const int N=101;
int d[N][M];
int a[N];
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(int i=0;i<=n;i++)
	{
		d[i][0]=1;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			d[i][j]=d[i-1][j];
			if(j>=a[i])
			d[i][j]+=d[i-1][j-a[i]];
		}
	}
	cout<<d[n][m];
	return 0;
}

posted @ 2022-09-17 19:35  LZH_03  阅读(19)  评论(0编辑  收藏  举报