poj 1837
dp问题
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <cstdlib> 5 #include <cmath> 6 #include <map> 7 #include <algorithm> 8 #include <list> 9 #include <ctime> 10 #include <set> 11 #include <string.h> 12 #include <queue> 13 #include <cstdio> 14 #define CLR(arr, what) memset(arr, what, sizeof(arr)) 15 typedef long long ll; 16 const int MAX = 16000; 17 int maxhalf = 8000; 18 using namespace std; 19 ll visit[2][MAX]; 20 int main() { 21 vector<ll> len; 22 vector<ll> weight; 23 int c, g; 24 while (scanf("%d%d", &c, &g) != EOF) { 25 ll t; 26 len.clear(); 27 weight.clear(); 28 CLR(visit, 0); 29 for (int i = 0; i < c; i++) { 30 cin >> t; 31 len.push_back(t); 32 } 33 for (int i = 0; i < g; i++) { 34 cin >> t; 35 weight.push_back(t); 36 } 37 int szl = len.size(); 38 int szw = weight.size(); 39 ll cost; 40 int even = 0; 41 visit[1][maxhalf] = 1; 42 for (int i = 0; i < szw; i++) { 43 int cur = even % 2; 44 int pre = (even + 1) % 2; 45 CLR(visit[cur], 0); 46 for (int k = 0; k < MAX; k++) { 47 if (visit[pre][k] >= 1) { 48 for (int j = 0; j < szl; j++) { 49 cost = weight[i] * len[j]; 50 visit[cur][k + cost] = visit[cur][k + cost] 51 + visit[pre][k]; 52 } 53 } 54 } 55 even++; 56 } 57 cout << visit[(even + 1) % 2][maxhalf] << endl; 58 } 59 return 0; 60 }