codeforces19B

题意:题目的意思是给你n个商品,每个商品有两个属性,第一个属性是付账需要的时间,第二个属性是商品的价值,然后这个小偷每1分钟能偷走一个商品,要你怎么安排商品的付账顺序,能让小偷付的钱最少,

一个简单的01背包,要求是必须得卖完,所以设置除dp【0】=0外其他都必须要设置为inf,而且更新是应该减去pro[i].t1+1的时间,因为这个商品能为接下来的pro[i].t1个商品打掩护,而且它自己本身也被取走了。

接下来是ac代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=2100;
 5 const ll inf=1e15+7;
 6 struct node{
 7     int ti,ci;
 8 };
 9 int n;
10 ll dp[maxn];
11 //flag=1,ans;
12 node pro[maxn];
13 int main(){
14     scanf("%d",&n);
15     for(int i=1;i<=n;i++){
16        scanf("%d%d",&pro[i].ti,&pro[i].ci);
17        //if(pro[i].ti!=0) flag=0;
18       // ans+=pro[i].ci; 
19    }
20     for(int i=1;i<=n;i++) dp[i]=inf;
21     dp[0]=0;
22     for(int i=1;i<=n;i++){
23         for(int j=n;j>=1;j--){
24             if(j>pro[i].ti+1) dp[j]=min(dp[j],dp[j-pro[i].ti-1]+pro[i].ci);
25             else dp[j]=min(dp[j],dp[0]+pro[i].ci);
26         }
27     }
28     cout<<dp[n]<<endl;
29     return 0;
30 }
View Code

猜你喜欢

转载自www.cnblogs.com/pandaking/p/9942570.html