hdu6092 01揹包加思維

2021-09-10 07:57:19 字數 885 閱讀 1295

前置知識這裡

本題已知每種和的個數 存在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 ...