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;
}