POJ 1260

#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[n]);
	}
	return 0;
}

POJ1260

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

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

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

从本质上讲这一题还是一个“划分”的变形。找到划分方法也就找到了动态转移方程。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值