传送门(洛谷)
简单动态规划一题
f
[
i
]
[
j
]
表
示
当
到
选
前
面
i
种
植
物
选
了
j
株
植
物
f[i][j]表示当到选前面i种植物选了j株植物
f[i][j]表示当到选前面i种植物选了j株植物
f [ i ] [ j ] + = f [ i − 1 ] [ j − k ] f[i][j]+=f[i-1][j-k] f[i][j]+=f[i−1][j−k]
为什么不能加上新植物
因为你正在枚举如果算上新植物,新植物选多少株啊。而且题上说了是从小到大顺序排好了的
Code
#include<bits/stdc++.h>
#define mod 1000007
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define don(i,a,b) for(register int i=(a);i>=(b);i--)
using namespace std;
const int maxn=1e5+10;
const int maxm=1e3+10;
int m,n;
int a[maxn];
int f[maxm][maxm];
template <class t> void read(t &x)
{
x=0;int f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=10*x+ch-'0';ch=getchar();}
x*=f;
}
template <class t> void write(t x)
{
if(x<0) {putchar('-');x=~x+1;}
if(x>9) write(x/10);
putchar(x%10+48);
}
/*------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------*/
void readdata()
{
memset(f,false,sizeof(f));
read(n),read(m);
rep(i,1,n) read(a[i]);
}
void work()
{
f[0][0]=1;
rep(i,1,n)
rep(j,0,m)
rep(k,0,a[i]) {
if(j>=k)
f[i][j]=(f[i-1][j-k]+f[i][j])%mod;
}
printf("%d\n",f[n][m]);
}
int main()
{
// freopen("input.txt","r",stdin);
readdata();
work();
return 0;
}