UVa11400 Lighting System Design

1715 단어 dpuva
제목을 보고 욕심인 줄 알고 욕심 문제를 어떻게 dp의 분류에 넣을지 생각했다.결국 내가 잘못했어.먼저 전압을 정렬하고 i제(제i저) 전원에 대해 0~i-1에서 이전 전원을 선택한다. 만약에 0을 선택한다면 현재 전원 i만 구입하는 것이 가장 좋다는 뜻이다.결과는 dp[n]이다. 어쨌든 마지막 전원은 반드시 사용해야 한다.
#include <iostream>         
#include <stdio.h>         
#include <cmath>         
#include <algorithm>         
#include <iomanip>         
#include <cstdlib>         
#include <string>         
#include <memory.h>         
#include <vector>         
#include <queue>         
#include <stack>         
#include <map>       
#include <set>       
#include <ctype.h>         
#define INF 1000000000       
#define ll long long     
#define min3(a,b,c) min(a,min(b,c))     
      
using namespace std;      
  
struct category{  
    int v;  
    int k;  
    int c;  
    int l;  
};  

int dp[1010];

category ctg[1010];  
int sum[1010];  

bool cmp(category c1,category c2){  
     return c1.v<c2.v;  
}  
  
int main(){  
	sum[0]=0;
	ctg[1].v=ctg[1].k=ctg[1].c=ctg[1].l=0;
    int n;  
    while(cin>>n){  
        if(n==0)break;  
        for(int i=1;i<=n;i++){
			dp[i]=INF;
		}
		  
        for(int i=1;i<=n;i++){  
            cin>>ctg[i].v>>ctg[i].k>>ctg[i].c>>ctg[i].l;  
        }  
          
        sort(ctg+1,ctg+n+1,cmp);  
          
        for(int i=1;i<=n;i++){  
            sum[i]=sum[i-1]+ctg[i].l;  
        }
        
        for(int i=1;i<=n;i++){
			for(int j=0;j<i;j++){
				int tmp=dp[j]+ctg[i].k+(sum[i]-sum[j])*ctg[i].c;
				dp[i]=min(dp[i],tmp);
			}
		}
          
        cout<<dp[n]<<endl;  
    }  
    return 0;  
}  

좋은 웹페이지 즐겨찾기