前置知識這裡
本題已知每種和的個數 存在b陣列裡
由此我們可以遞推求解
b[i]-前面構造成i大小的方法數= i的個數 此值設為變數num
如b[2]-前面構造成2大小的方法數= 2的個數
然後就變成了求前面構造成i大小的方法數的問題
這個就是01揹包 a【】陣列為物品 價值均為1 重量為a【i】
所以我們有公式
dp【j】【k】 =dp[j-1][k]+dp[j-1][k-a[i]] 由j個物品構造成k 的方法數
由於a[i]是由i從1開始構造 由很多重複 為了節省時間不再多開一次迴圈 a【i】直接用i代替
就變成:
dp【j】【k】 = dp[j-1][k]+dp[j-1][k-i]
比如 i=1 此時dp【num】【m】就是全部由1構成 大小為m的方法數
i=2 此時dp【num】【m】就是全部由1,2構成 大小為m的方法數
然後再無腦滾動陣列一下 就是dp[k]+=dp[k-i]
為啥可以變a[i]為i?
比如構造的a為 1 1 2
現在我要算 dp(3) 在dp(3-2)即dp(1)時 他同時疊加了在dp(1)時 dp(1-0)的狀態
講的好亂....
#include#include#define clr(a,b) memset(a,b,sizeof(a));
using namespace std;
int a[100];
int b[10010];
int dp[10010];
int main()
}} printf("%d",a[0]);
for(int i=1;i結合**看下吧
D Manga Market 思維加01揹包
並且,其中的a如果不等於0 那麼肯定a 1 如果在t 時間訪問完ai 那麼下乙個訪問完花費時間是 t 1 aj bj t 這就相當於兩倍的t還多 照這樣加些去,會變成4t 8t 幾何式增長,所以只要30次就夠了,然後考慮到還有a 0的,所以呢,如果訪問了i個a 1 的,再找到符合t時間a 0超時就行...
D Manga Market 思維加01揹包
並且,其中的a如果不等於0 那麼肯定a 1 如果在t 時間訪問完ai 那麼下乙個訪問完花費時間是 t 1 aj bj t 這就相當於兩倍的t還多 照這樣加些去,會變成4t 8t 幾何式增長,所以只要30次就夠了,然後考慮到還有a 0的,所以呢,如果訪問了i個a 1 的,再找到符合t時間a 0超時就行...
hdu3033 加限制條件的0 1揹包
1 include stdlib.h 2 include stdio.h 3 include string h 4int n,m,k,p 101 max 0 v 101 5 intbr 11 101 sum 11 6long f 11 10001 7 8int main 18for i 1 i k ...