ZOJ1524
题意:给定需要购买物品的顺序以及总物品对应的价格,求解按顺序购买物品时最小花费。
输入:
m,n(m代表需要购买物品的清单,n代表总的物品数)
Xi...(代表对应物品的序号以及价格)
输出:
cost(最小花费,有精度要求)
思路:对于商品j,有购买和不购买两种选择,并且如果j序号正好和i匹配,说明是符合条件的,那么此时最小花费应是不买(dp[1][j])和购买(dp[0][j-1]+price[j])中最小值,注意之前dp每次循环时需要初始化第一个下标。
输入:
m,n(m代表需要购买物品的清单,n代表总的物品数)
Xi...(代表对应物品的序号以及价格)
输出:
cost(最小花费,有精度要求)
思路:对于商品j,有购买和不购买两种选择,并且如果j序号正好和i匹配,说明是符合条件的,那么此时最小花费应是不买(dp[1][j])和购买(dp[0][j-1]+price[j])中最小值,注意之前dp每次循环时需要初始化第一个下标。
#include<iostream> #include<fstream> #include<memory.h> #define MAX 100001 #define N 1e10 using namespace std; int a[101]; int Index[MAX]; double price[MAX]; double dp[2][MAX]; int n,m,i,j; void ss() { for(i=1; i<=n; i++) cin>>a[i]; for(i=1; i<=m; i++) cin>>Index[i]>>price[i]; dp[1][0]=N; for(j=0; j<=m; j++) dp[0][j]=0; for(i=1; i<=n; i++) { for(j=i; j<=m; j++) { if(j!=i) dp[1][j]=dp[1][j-1]; else dp[1][j]=N; if(a[i]==Index[j]) dp[1][j]=min(dp[1][j],dp[0][j-1]+price[j]); } for(j=0; j<=m; j++) dp[0][j]=dp[1][j]; } } int main() { while(cin>>n>>m,n&&m) { ss(); double ans=dp[1][m]; if(ans==N) cout<<"Impossible"<<endl; else printf("%.2lf\n",ans); } return 0; }