AHU-743 多重部分和问题 【多重背包变种】
生活随笔
收集整理的這篇文章主要介紹了
AHU-743 多重部分和问题 【多重背包变种】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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)
題解:
15年省賽的一道題,題目沒啥難度,看下數據范圍多重背包可以跑,只需要看某個狀態i是否可以達到用bool數組就行,二進制優化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 }
接下來是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 3 3 5 8 3 2 2 17 2 1 2 1 1 4 Sample Output Yes No題解:
15年省賽的一道題,題目沒啥難度,看下數據范圍多重背包可以跑,只需要看某個狀態i是否可以達到用bool數組就行,二進制優化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 }
?
轉載于:https://www.cnblogs.com/robin1998/p/6795741.html
總結
以上是生活随笔為你收集整理的AHU-743 多重部分和问题 【多重背包变种】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flstudio插件找不到_FL Stu
- 下一篇: 书单|双十一必入的科普口碑好书