您的位置:首页 > 其它

Vijos P1836 HYS与七夕节大作战

2016-09-13 15:01 162 查看
P1836HYS与七夕节大作战Accepted

背景

一年一度的七夕节到了,HYS又开始烦恼他的约会安排,作为一名后辈,你被他选中来帮助他。

描述

由于HYS有很多名女友,所以他不可能在一天之内和所有的女友都进行约会,于是你决定帮他选定一些女友进行约会。每一个女友的约会都不相同,和一名女友约会,会需要T的时间,而每一个女友的重要度不尽相同。时间是宝贵的,一天只有24hrs,所以你决定帮他安排好一个计划,可以让他尽量和最重要的女友"们"约会。但是,当你收到他的女友名单的时候,你发现女友的数量实在太多了,不得不借助计算机来帮你安排。当然,HYS在同一时间不可能和两个女友约会,但是约会的先后顺序没有影响。

格式

输入格式

第一行有一个数N,代表HYS的女友数量。之后第2行到N+1行每行有两个数,T和V。分别代表约会所需要的时间(表示为占一天的百分比)和女友的重要度。

输出格式

第一行输出一个数,表示在你的安排下,与HYS约会的女友的重要度之和(要求精确到小数点后5位)。

样例1

样例输入1[复制]

8
37.50000 5
12.50000 5
6.75000 3
6.75000 3
12.50000 4
25.00000 5
6.75000 3
8.00000 4

样例输出1[复制]

27

限制

1≤N≤1000;1≤V≤5;0≤T≤100;其中T的精度保证和输出精度一致。

这个题最开始想的是把小数换成整数,也就是乘以100000,然后再背包,然后就TLE了……
后来看了人家的题解,发现可以逆向的背包,也就是求重要度不超过sum(v1,v2……,vn)的情况下,时间最小值
因为重要度是整数,方便处理,,,
也就是dp[j] = min(dp[j],dp[j - v[i]] + t[i]);
那么只要dp[j] 是小于100%的,j这个重要度就是可以达到的,更新最大值j即可
这是一个逆向思维的背包
代码:
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define maxn (1000 + 20)#define inf 0x3f3f3f3f#define pi acos(-1.0)using namespace std;typedef long long int LLI;double t[maxn];int v[maxn];double dp[10000000 + 50];int main() {//    freopen("in.txt","r",stdin);//    freopen("out1.txt","w",stdout);int n,sum = 0;scanf("%d",&n);for(int i = 1; i <= n; i ++)scanf("%lf%d",&t[i],&v[i]),sum += v[i];for(int i = 0;i <= sum;i ++)    dp[i] = 1000.0;dp[0] = 0;int re = 0;for(int i = 1; i <= n; i ++) {for(int j = sum; j >= v[i]; j --) {dp[j] = min(dp[j],dp[j - v[i]] + t[i]);if(dp[j] < 100.0)   re = max(re,j);}}printf("%d\n",re);return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  背包