Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 2007
- using namespace std;
- int dp[MAX][MAX], conserto[MAX], venda[MAX];
- int n, m, p, ini;
- int solve(int pos, int idade){ // dp para saber o menor caminho
- if(pos == n) return dp[pos][idade] = 0;
- if(dp[pos][idade] != -1) return dp[pos][idade];
- int f_way = solve(pos+1, 1) + p-venda[idade] + conserto[0];
- if(idade == m) return dp[pos][idade] = f_way;
- int s_way = solve(pos+1, idade+1) + conserto[idade];
- return dp[pos][idade] = min(f_way, s_way);
- }
- void min_way(){ // percorre a dp para achar as melhores voltas feitas
- vector<int> ans;
- memset(dp[n], 0, sizeof dp[n]);
- int idade = ini;
- for(int i = 0; i < n; i++){
- if(idade == m){
- ans.push_back(i+1);
- idade = 1;
- }else{
- int f_way = dp[i+1][1] + p - venda[idade] + conserto[0];
- int s_way = dp[i+1][idade + 1] + conserto[idade];
- if(f_way <= s_way){
- ans.push_back(i+1);
- idade = 1;
- }else idade++;
- }
- }
- if(!ans.size()) cout << 0 << endl;
- else{
- for(int i = 0; i < ans.size(); i++) cout << ans[i] << " \n"[i == ans.size()-1];
- }
- }
- int main(){
- while(cin >> n >> ini >> m >> p){
- for(int i = 0; i < m; i++) cin >> conserto[i];
- for(int i = 1; i <= m; i++) cin >> venda[i];
- memset(dp, -1, sizeof dp);
- cout << solve(0, ini) << endl;
- min_way();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement