题意简述:需要购买n件物品,从m件商品中按顺序进行选择,求出从m件商品中购买到所需的n件物品最低消费,如果购不齐输出Impossible n>=0 && n <= 100 m>=0 & m<=100。
例1: 2 3
1 2
2 0.05
1 10.00
1 3.00
Impossible
例2: 2 3
1 2
1 10.00
1 3.00
2 0.05
3.05
解决程序:
#include<iostream>
using namespace std;
#define MAX 1E100 ; //最大值,表示不存在
int needs[100],goods[1000]; // needs 需要购买的物品 goods 可以选择的商品
double price[1000]; //商品对应的价格
double res[1000][100]; //从m件商品中购买n件商品所需的价格
int main()
{
int n,m,i,j ;
cin >> n >> m; //输出所物品数 及提供的商品数
res[0][0] = 0; //边界条件1: 没有购买物品 价格为0
for(i=1;i<=n;i++) //存储虚购物品的编号
{
cin >> needs[i] ;
res[0][i] = MAX; //边界条件2:如果不提供商品 所需的物品已购齐 这种情况不存在
}
for(i=1;i<=m;i++)
{
cin >> goods[i] >> price[i];
res[i][0] = 0; //边界条件3: 所有的商品列表中没有所需物品的物品,价格为0
}
for(j=1;j<=m;j++)
{
for(i=1;i<=n;i++)
{
res[j][i] = res[j-1][i]; // 假设在选前j个商品的时候已经购买了全部物品价格
if( needs[i] == goods[j] && res[j][i]>res[j-1][i-1]) //判断当前的商品是否是所需的物品,再判断选当前商品 ,价格总数是否会更小 如果是更新当前选中的商品
{
res[j][i] = res[j-1][i-1] + price[j];
}
}
}
if(res[j][i] > 1E90){ //判断选完商品以后的总价格,是否合理
cout << "Impossible" << endl;
} else {
cout << res[m][n] << endl;
}
}