题意:题目的意思是给你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 }