AHU 743 多重部分和問題 多重揹包變種

2022-07-13 04:03:09 字數 1408 閱讀 8464

description

有n種不同大小的數字,每種各個。判斷是否可以從這些數字之中選出若干使它們的和恰好為k。

input

首先是乙個正整數t(1<=t<=100)

接下來是t組資料

每組資料第一行是乙個正整數n(1<=n<=100),表示有n種不同大小的數字

第二行是n個不同大小的正整數ai(1<=ai<=100000)

第三行是n個正整數mi(1<=mi<=100000),表示每種數字有mi個

第四行是乙個正整數k(1<=k<=100000)

output

對於每組資料,如果能從這些數字中選出若干使它們的和恰好為k,則輸出「yes」,否則輸出「no」,每個輸出單獨佔一行

sample input

2

33 5 8

3 2 2172

1 21 1

4

sample output

yes

no

題解:

15年省賽的一道題,題目沒啥難度,看下資料範圍多重揹包可以跑,只需要看某個狀態i是否可以達到用bool陣列就行,二進位制優化0ms。

**:

1 #include2

using

namespace

std;

3#define inf 0x3f3f3f3f

4#define m(a, b) memset(a, b, sizeof(a))

5const

int n = 105;6

inta[n], num[n];

7bool f[100005];8

9int

main()

24else

31int y = m*a[i];

32for (int x = k; x >= y; --x)

33if (f[x-y]) f[x] = 1;34

}35}36

if (f[k]) printf("

yes\n");

37else printf("

no\n

"); 38}

3940

return0;

41 }

多重部分和問題

有 n 種物品,第i種物品的每個物品的價值是 ai 數目是 mi 判斷是否可以選擇若干數字使得價值和是k。1 n 100 1 ai,m i,10 5 1 k 105 看作揹包大小是k,物品的價值和體積都是ai 物品數目是 mi 的多重揹包。如果最大價值是 k 的話就是可以選出,否則便是不能選出。利用...

多重部分和問題

有n種不同大小的數字a i 每種各m i 個。判斷是否可以從這些數字之中選出若干使它們的和恰好為k。dp i 表示以a i 為末尾的最長上公升子串行的長度。include include include includeusing namespace std define maxn 10010 int...

多重部分和問題

有n種不同大小的數字a i 每種各m i 個。判斷是否可以從這些數字中選出若干使它們的和恰好為k。限制條件 1 n 100,1 a i m i 100000,1 k 100000 這個問題可以用dp求解,如何定義遞推式影響最後的時間複雜度。定義dp i 1 j 用前i 1種數字 數字的編號是從0到i...