[Programación Dinámica] Mochila Completa: División Entera (Número de Soluciones)


Se puede transformar en un problema de mochila completo 
Selecciona varios números del 1 al n para que su suma sea exactamente n ¿Cuántas soluciones hay en total?



dp[i][j] representa el número de soluciones seleccionadas de los i números anteriores para que su suma sea exactamente j

Considere cuántas veces se selecciona el i-ésimo número 
dp[i][j]=dp[i-1][j]+dp[i-1][ji]+dp[i-1][j-2* yo]+ ...

Optimización del tiempo:
tenga en cuenta que dp[i][ji]=dp[i-1][ji]+dp[i-1][j-2*i]+dp[i-1][j-3*i] +....
entonces dp[i][j]=dp[i-1][j]+dp[i][ji]

Optimización del espacio:
matriz rodante 
para i 1~n:
  para ji~n: dp[j]=dp[j]+dp[ji]  

Código:

	int n;
	cin>>n;
	memset(dp,0,sizeof(dp));
	dp[0]=1;
    for(int i=1;i<=n;i++)
    {
    	for(int j=i;j<=n;j++)
    	{
    		dp[j]=(dp[j]+dp[j-i])%mod;
		}
	}
	cout<<dp[n];

Supongo que te gusta

Origin blog.csdn.net/m0_52043808/article/details/124001818
Recomendado
Clasificación