这个题目拿到一看,马上就感觉又是带权的最长公共子序列的DP问题,觉得应该问题不大。真正动手一写,发现面对序列中不匹配的时候,处理起来好像很麻烦,一时没想到什么好办法。最后还是用的滚动数组绕开了原来的问题。下面贴代码:
View Code
1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 int a[101]; 5 double dp[101]; 6 int main() 7 { 8 int m,n,num,i,j; 9 double price; 10 while(cin>>m>>n)//m是列表中需要购买的商品数,n是超市里商品的总数 11 { 12 if(m == 0 && n == 0) 13 break; 14 for(i = 1;i <= m;i++) 15 dp[i] = 1e100; 16 dp[0] = 0; 17 for(i = 1;i <= m;i++) 18 cin>>a[i]; 19 for(i = 1;i <= n;i++) 20 { 21 cin>>num>>price;//num商品编号,price商品价格 22 for(j = m;j >= 1;j--)//必须逆序枚举列表中的商品 23 { 24 if(num == a[j] && dp[j - 1] + price < dp[j]) 25 dp[j] = dp[j - 1] + price; 26 } 27 } 28 if(dp[m] == 1e100) 29 cout<<"Impossible"<<endl; 30 else 31 cout<<fixed<<setprecision(2)<<dp[m]<<endl; 32 } 33 return 0; 34 }