日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AHU-743 多重部分和问题 【多重背包变种】

發(fā)布時間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AHU-743 多重部分和问题 【多重背包变种】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Description 有n種不同大小的數(shù)字,每種各個。判斷是否可以從這些數(shù)字之中選出若干使它們的和恰好為K。 Input 首先是一個正整數(shù)T(1<=T<=100)
接下來是T組數(shù)據(jù)
每組數(shù)據(jù)第一行是一個正整數(shù)n(1<=n<=100),表示有n種不同大小的數(shù)字
第二行是n個不同大小的正整數(shù)ai(1<=ai<=100000)
第三行是n個正整數(shù)mi(1<=mi<=100000),表示每種數(shù)字有mi個
第四行是一個正整數(shù)K(1<=K<=100000)

?

Output 對于每組數(shù)據(jù),如果能從這些數(shù)字中選出若干使它們的和恰好為K,則輸出“Yes”,否則輸出“No”,每個輸出單獨占一行

?

Sample Input 2 3 3 5 8 3 2 2 17 2 1 2 1 1 4 Sample Output Yes No

題解:

15年省賽的一道題,題目沒啥難度,看下數(shù)據(jù)范圍多重背包可以跑,只需要看某個狀態(tài)i是否可以達到用bool數(shù)組就行,二進制優(yōu)化0ms。


代碼:

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define INF 0x3f3f3f3f 4 #define M(a, b) memset(a, b, sizeof(a)) 5 const int N = 105; 6 int a[N], num[N]; 7 bool f[100005]; 8 9 int main() { 10 int T, n, k; 11 scanf("%d", &T); 12 while (T--) { 13 scanf("%d", &n); 14 for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); 15 for (int i = 1; i <= n; ++i) scanf("%d", &num[i]); 16 scanf("%d", &k); 17 M(f, 0); f[0] = 1; 18 for (int i = 1; i <= n; ++i) { 19 int sum = num[i] * a[i]; 20 if (sum >= k) { 21 for (int j = a[i]; j <= k; ++j) 22 if (f[j-a[i]]) f[j] = 1; 23 } 24 else { 25 int m = num[i]; 26 for (int j = 1; j <= m; m-=j, j <<= 1) { 27 int y = j*a[i]; 28 for (int x = k; x >= y; --x) 29 if (f[x-y]) f[x] = 1; 30 } 31 int y = m*a[i]; 32 for (int x = k; x >= y; --x) 33 if (f[x-y]) f[x] = 1; 34 } 35 } 36 if (f[k]) printf("Yes\n"); 37 else printf("No\n"); 38 } 39 40 return 0; 41 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/robin1998/p/6795741.html

總結(jié)

以上是生活随笔為你收集整理的AHU-743 多重部分和问题 【多重背包变种】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。