p1077 [noip2012 普及組] 擺花 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
很很很基礎的一道01揹包問題,但是對目前的我來說還是有亮點的。
狀態表示:前i種花共j盆的擺放方案數量
狀態計算:
1.如果第i種花不擺:f[i,j]=f[i-1,j]
2.如果第i種花擺:
遍歷第i種花能擺放擺放的數量,f[i,j]=sum(f[i-1,j-k]) k的範圍是從0到a[i]
嘿嘿嘿,這樣一看就變成01揹包咯
直接對j倒著for迴圈,把二維變成一維。
1注意第六行k的迴圈。裸的01揹包是沒有這個for迴圈的,因為這個物品只有0或1,但是這道題每種花的數量不止1個,所以我們需要遍歷每種花的數量。for(int i=1;i<=n;i++)
29 }
問題:為什麼k從1開始迴圈,明明第i種花還可以不選,這樣k應該是0呀。
回答:因為當k=1的時候,括號中的f[j]就是f[i-1,j]即不選第i種花時的方案。
問題:為什麼len是a[i],j的最小值
回答:因為f[j]是f[j-k]的總和,k的範圍是0到a[i],那麼我們就要保證j-k不是負值,所以k要小於等於j,並且k的範圍是0到a[i],所以k要小於等於min ( a [ i ] , j )。
1 #include 2view codeusing
namespace
std;
3const
int n=200,mod=1000007;4
intn,m,a[n],f[n];56
intmain()720
}2122 printf("
%d\n
",f[m]);
2324
return0;
25 }
擺花 dp,揹包,各種優化
題目描述 小明的花店新開張,為了吸引顧客,他想在花店的門口擺上一排花,共m盆。通過調查顧客的喜好,小明列出了顧客最喜歡的n種花,從1到n標號。為了在門口展出更多種花,規定第i種花不能超過ai 盆,擺花時同一種花放在一起,且不同種類的花需按標號的從小到大的順序依次擺列。試程式設計計算,一共有多少種不同...
多重揹包 P1077 擺花
題目描述 小明的花店新開張,為了吸引顧客,他想在花店的門口擺上一排花,共mm盆。通過調查顧客的喜好,小明列出了顧客最喜歡的nn種花,從11到nn標號。為了在門口展出更多種花,規定第ii種花不能超過a iai 盆,擺花時同一種花放在一起,且不同種類的花需按標號的從小到大的順序依次擺列。試程式設計計算,...
P1077 擺花 揹包DP
小明的花店新開張,為了吸引顧客,他想在花店的門口擺上一排花,共m盆。通過調查顧客的喜好,小明列出了顧客最喜歡的n種花,從1到n標號。為了在門口展出更多種花,規定第iii種花不能超過 a i 盆,擺花時同一種花放在一起,且不同種類的花需按標號的從小到大的順序依次擺列。試程式設計計算,一共有多少種不同的...