Acwing900. 整数划分[计数类dp]:完全背包解法
生活随笔
收集整理的這篇文章主要介紹了
Acwing900. 整数划分[计数类dp]:完全背包解法
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 題目分析
- 完全背包解法
- 題目鏈接
題目分析
完全背包解法
請復(fù)習(xí)完全背包模板完全背包dp優(yōu)化內(nèi)有完整標(biāo)準(zhǔn)完全背包的推導(dǎo)過程
狀態(tài)表示: f[i][j]f[i] [j]f[i][j] 表示從 1~i 中選,且總和等于j 的方案數(shù)。
狀態(tài)轉(zhuǎn)移方程:(推導(dǎo)過程見下方代碼)
f[i][j]=f[i?1][j]+f[i][j?i]f[i][j] = f[i-1][j] + f[i][j-i]f[i][j]=f[i?1][j]+f[i][j?i]
優(yōu)化成一維f[j]=f[j]+f[j?i]f[j] =f[j] +f[j-i]f[j]=f[j]+f[j?i](此時(shí)需要從小到大枚舉)
ac代碼
/* 類似完全背包問題:每個(gè)數(shù)可以取無數(shù)次f[i][j] 表示從 1~i 中選,且總和等于j 的方案數(shù) (1)式:f[i][j] = f[i-1][j] + f[i-1][j-i]+ f[i-1][j-2*i] +...+f[i-1][j-s*i](2)式:f[i] [j-i] = f[i-1][j-i] + f[i-1][j-2*i]+...+f[i-1][j-s*i]替換一下:(2)式替換(1)式得到狀態(tài)轉(zhuǎn)移方程: f[i][j] = f[i-1][j]+ f[i][j-i]空間優(yōu)化一下:第一維去掉f[j] =f[j]+f[j-i] 體積從小到大循環(huán)*/#include<bits/stdc++.h> using namespace std;const int N = 1010 ,mod =1e9+7; int n; int f[N]; int main(){cin>>n;f[0] =1 ;for(int i=1;i<=n;i++){for(int j=i;j<=n;j++){f[j] = (f[j]+ f[j-i] ) % mod;}}cout<<f[n]<<endl;}題目鏈接
Acwing900. 整數(shù)劃分
總結(jié)
以上是生活随笔為你收集整理的Acwing900. 整数划分[计数类dp]:完全背包解法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Acwing756. 蛇形矩阵:模拟
- 下一篇: Acwing291. 蒙德里安的梦想:状