1.题意:有n种珍珠,价格为pi,数量为ai,每种珍珠买的时候数量总数要加10;质量低的可以被质量高的替代;
2.错误思路:从最低的开始计算是否可以被下一个替代,如果可以就把这个的数量加到下一个上,不能则ans+=(ai+10)*pi;
3.这是错误。。的错误 错误,比如
10 10
5 15
10 23
此时,假设我们判断的时候,20*10>15*10我们应该把10加到5上,然后又会发现15需要加到下一个,感觉没什么问题。。但,此时相当于,将第一类用第三类代替,明显不划算,
并且最优应该第一类不换,第二类用第三类换,所以正确解法应该为找到每一个价格所能包含的最优解,比如23可以包含第二类和第三类,不能包含第一类;
4.代码:
1 #include<iostream> 2 using namespace std; 3 int min(int a,int b){return a>b?b:a;} 4 void make() 5 { 6 int n, i ,j; 7 int sum[200],a[200],b[200],dp[200]; 8 sum[0]=0;dp[0]=0; 9 cin>>n; 10 for (i = 1;i<=n;i++) 11 { 12 cin>>a[i]>>b[i]; 13 sum[i]=sum[i-1]+a[i]; 14 dp[i]=dp[i-1]+(a[i]+10)*b[i]; 15 } 16 for (i=1;i<=n;i++) 17 for (j=0;j<i;j++) 18 dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j]+10)*b[i]); 19 cout<<dp[n]<<endl; 20 } 21 int main() 22 { 23 int t; 24 cin>>t; 25 while(t--) make(); 26 return 0; 27 }
时间: 2024-10-19 16:25:53