Untitled
unknown
plain_text
2 years ago
2.1 kB
5
Indexable
#include <iostream> using namespace std; int N; int packages; int prices[35]; int p[35][35]; int a[35]; // need int needs; int bought[35]; // visit int total; void reset(){ for(int i = 0; i < 35; i++){ prices[i] = 0; a[i] = 0; bought[i] = 0; for(int j = 0; j < 35; j++){ p[i][j] = 0; } } } int buy(int k){ int cnt = 0; for(int j = 1; j <= N; j++){ if(p[k][j] == 1 && a[j] == 1 && bought[j] == 0) { cnt++; } } return cnt; } int calPrice(int k){ int sum = 0; for(int j = 1; j <= N; j++){ if(p[k][j] == 1 && a[j] == 1) { sum += prices[j]; } } return sum; } void mark(int k){ for(int j = 1; j <= N; j++){ if(a[j] == 1 && p[k][j] == 1) { bought[j]++; } } } void unmark(int k){ for(int j = 1; j <= N; j++){ if(a[j] == 1 && p[k][j] == 1 && bought[j] != 0) { bought[j]--; } } } void kt(){ for(int i = 1; i <= N; i++){ cout << bought[i] << " "; } cout << endl; } void Try(int sum, int cnt, int t){ if(sum > total) return; if(cnt == needs){ if(sum < total) total = sum; return; } if(t == packages + 1 && cnt < needs){ for(int k = 1; k <= N; k++){ if(bought[k] == 0 && a[k] == 1){ sum += prices[k]; } } if(sum < total) total = sum; return; } int c = buy(t); if(c > 0){ mark(t); Try(sum + p[t][N + 1], cnt + c, t+1); unmark(t); Try(sum, cnt, t+1); }else { Try(sum, cnt, t+1); } } int main(){ // freopen("input.txt", "r", stdin); int T; cin >> T; for(int tc = 1; tc <= T; tc++){ cin >> N; reset(); for(int i = 1; i <= N; i++){ cin >> prices[i]; } cin >> packages; for(int i = 1; i <= packages; i++){ int price, cnt; cin >> price >> cnt; for(int j = 1; j <= cnt; j++){ int x; cin >> x; p[i][x] = 1; } p[i][N + 1] = price; p[i][N + 2] = cnt; } cin >> needs; for(int i = 1; i <= needs; i++){ int x; cin >> x; a[x] = 1; total += prices[x]; } Try(0, 0, 1); cout << "#" << tc << " " << total << endl; } return 0; }
Editor is loading...