您的位置:首页 > 编程语言 > C语言/C++

POJ 1260

2013-10-02 15:49 405 查看
#include<iostream>
#include<fstream>
#include<cstdlib>

using namespace std;

//#define DEBUG
/* 244K	0MS */
static const int MAX = 101;
static int count[MAX];
static int price[MAX];
static int presum[MAX];
static int n;
static int f[MAX];

int main()
{
#ifdef DEBUG
fstream cin("G:\\book\\algorithms\\acm\\Debug\\dat.txt");
#endif
int t;
cin >> t;
while (t-- > 0)
{
cin >> n;
int i, j;
for (i = 1; i <= n; i++)
{
cin >> count[i] >> price[i];
presum[i] = presum[i - 1] + count[i];
}

f[1] = (count[1] + 10) * price[1];
for (i = 2; i <= n; i++)
{
int min = (presum[i] + 10) * price[i];
for (j = 1; j < i; j++) /* 列举全部可能性 找到最小值 */
{
int tmp = (presum[i] - presum[j] + 10) * price[i] + f[j];
if (tmp < min)
min = tmp;
}
f[i] = min;
}
printf("%d\n", f
);
}
return 0;
}

POJ1260

对于第i项,列举其全部的可能组合,进行比较找到其中的最小值,就是解。题目中的输入数据已经做了部分简化,

1.输入数据按照price的升序进行排列

2.购买时的替代是单方向的

从本质上讲这一题还是一个“划分”的变形。找到划分方法也就找到了动态转移方程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ POJ C基础知识