题目

[JZOJ 5184] Gift {01背包变形}
[JZOJ 5184] Gift {01背包变形}


解题思路01背包变形

f[i][j]f[i][j]表示 1i1 \sim i不选,耗费jj费用的方案数。
初始化f[n+1][0]=1f[n+1][0]=1
动态规划转移方程为f[i][j]=(f[i+1][j]+(j>a[i]?f[i+1][ja[i]]:0))% modf[i][j]=(f[i+1][j]+(j>a[i]?f[i+1][j-a[i]]:0))\%\ mod


代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#define rr register 
using namespace std; 
int n,m,a[1501],f[1501][1501],ans,per[1501]; 
const int mod=1e7+7; 
inline int minn(int x,int y){if (x<y) return x; return y;}
inline int read()
{
	int p=0; char c=getchar();
	while (!isdigit(c)) c=getchar(); 
	while (isdigit(c)) p=(p<<3)+(p<<1)+c-48,c=getchar();
	return p; 
}
int main()
{
	n=read(),m=read();
	for (rr int i=1;i<=n;i++) a[i]=read();
	sort(a+1,a+n+1);
	for (rr int i=1;i<=n;i++) per[i]=per[i-1]+a[i];
	if (per[n]<=m) return 0&printf("1"); 
	f[n+1][0]=1; 
	for (rr int i=n;i>=1;i--)
	 for (rr int j=0;j<=m;j++)
	 f[i][j]=(f[i+1][j]+(j>=a[i]?f[i+1][j-a[i]]:0))%mod; 
	for (rr int i=1;i<=n;i++)`i枚举的是最小的不选数`
	 for (rr int j=0;j<a[i];j++)
	 if (m-per[i-1]-j>=0) 
	 ans=(ans+f[i+1][m-per[i-1]-j])%mod; 
	printf("%d",ans); 
}

相关文章:

  • 2021-09-18
  • 2021-07-18
  • 2021-10-03
  • 2018-04-18
  • 2021-08-17
  • 2022-12-23
  • 2022-01-27
  • 2021-08-29
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-02-19
  • 2021-06-15
  • 2021-07-11
  • 2021-06-22
相关资源
相似解决方案