关闭

UVa 10280 Old Wine Into New Bottles / 完全背包

753人阅读 评论(0) 收藏 举报
分类:

转自http://blog.csdn.net/yan_____/article/details/8671147

1、这道题如果直接把每个酒瓶的可用容量来做完全背包的话会超时,但是由最低的容量不低于95%,最高的容量不超过99%,由于容量的连续性有一些规律可循,可藉此优化:

   考虑任意一种瓶子能够将酒全装满的情况,最小容量min,最大容量max,只要酒的体积x在[min,max]|[2*min,2*max]|……[k*min,k*max]的范围内就能完全装满,而max比min大,倍乘后单个区间长度会越来越长,而区间左端保持等距,右端距离越来越远,每当增加一个k,上一区间的右端点与当前区间的左端点距离就会减小(max-min),所以当(k+1)增加到(min*2-max)/(max-min)时各个区间就会相连,即min*(k+1)>max*k,得到k<min/(max-min),我们要求的边界就是k*min<min*min/(max-min),在这之后x都能装满

举个例子min=95,max=99

95     99
190     198
285     297
380     396
475     495
570     594
665     693
760     792
855     891
950     990
1045     1089
1140     1188
1235     1287
1330     1386
1425     1485
1520     1584
1615     1683
1710     1782
1805     1881
1900     1980
1995     2079
2090     2178
2185     2277
2280     2376//这里开始相连,2280是边界
2375     2475
2470     2574
2565     2673
2660     2772
2755     2871
2850     2970
2945     3069
3040     3168
3135     3267
3230     3366
3325     3465
3420     3564

2、瓶子最多有100个,全部满足的容量可能会有重叠,如果忽视重复容量会超时

#include<stdio.h>
#include<string.h>
#define s 2500
#define maxn 450000
int v;
int dp[maxn],vis[4600],c[4600];
int a[110],b[110];
int main()
{
    int i,j,k,l,n,m;
    int t;
    scanf("%d",&t);
    while(t--)
    {
        k=1<<30;
        scanf("%d %d",&v,&n);
        v=v*1000;
        dp[0]=1;
        for(i=0;i<n;i++)
        {
            scanf("%d %d",&a[i],&b[i]);
            if(k>a[i]*a[i]/(b[i]-a[i]))
                k=a[i]*a[i]/(b[i]-a[i]);
        }
        if(v>=k)
        {
            printf("0\n");
            if(t)
            printf("\n");
        }
        else
        {
            m=0;
            memset(vis,0,sizeof(vis));
            memset(dp,0,sizeof(dp));
            for(i=0;i<n;i++)
            {
                for(j=a[i];j<=b[i];j++)
                {
                    if(!vis[j])
                    {
                        c[m++]=j;
                        vis[j]=1;
                    }
                }
            }
            dp[0]=1;
            for(i=0;i<m;i++)
            {
                for(j=c[i];j<=v;j++)
                    if(dp[j-c[i]]==1)
                        dp[j]=1;
            }
            for(i=v;i>=0;i--)
            {
                if(dp[i])
                    break;
            }
            printf("%d\n",v-i);
            if(t)
            printf("\n");
        }
    }
    return 0;

}


 

0
0
查看评论

uva 10280 - Old Wine Into New Bottles(完全背包)

题目链接:10280 - Old Wine Into New Bottles 题目大意:现在有L升酒,以及n种酒瓶,现在给出每种酒瓶的最小容量和最大容量,每种酒瓶可以使用无限多次,问,怎样装酒,可以使得剩下的酒(即未能装进酒瓶中的酒)最少,输出最小值。 解题思路:刚开始直接背包,...
  • u011328934
  • u011328934
  • 2013-09-25 08:59
  • 1794

UVA - 10280 Old Wine Into New Bottles

题意:给定c升酒,然后有n种瓶子,每个瓶子有最少装酒min毫升和最多装酒max毫升。 并且min <= 0.99 max。要求出用这些瓶子来装酒最后剩下酒最少的升数。  一眼看下就是完全背包,但如果单纯的这样处理会超时,看了题解原来这需要减枝, 看看这个吧 点击打开链接 ...
  • u011345136
  • u011345136
  • 2013-10-09 12:44
  • 592

UVA 10280 - Old Wine Into New Bottles

题目总结~~> 做题感悟:这题类似yi
  • u011074149
  • u011074149
  • 2014-08-20 12:17
  • 446

Old Wine Into New Bottles - UVa 10280 dp

Problem C: Old Wine Into New Bottles Wine bottles are never completely filled: a small amount of air must be left in the neck to allow for thermal ...
  • u014733623
  • u014733623
  • 2014-08-06 22:39
  • 412

uva 10280 - Old Wine Into New Bottles

import java.io.*; import java.math.BigInteger; import java.util.*; class problem { int cases, bt, target, limit; int[] arr=new int[4600...
  • dyhu083
  • dyhu083
  • 2014-02-28 08:22
  • 447

UVA - 10280 Old Wine Into New Bottles 剪枝+完全背包

题目大意:有N升酒,M种容量不同的瓶子,瓶子的个数有无限个,每个瓶子装入的酒限制,必须大于等于当前酒瓶的min,小于等于当前酒瓶的max,问如果将这些酒装入酒瓶中,最少能剩下多少 解题思路:如果开一个数组存放的话,那么空间大小就有1000000 * 1000,很明显是暴的。通过观察可以得到一个规律...
  • L123012013048
  • L123012013048
  • 2014-12-17 00:11
  • 442

uva 10280 Old Wine Into New Bottles (有剪枝的完全背包)

思路参考了这篇博客:http://blog.csdn.net/yan_____/article/details/8671147AC代码:#include <cstdio> #include <cstring> #include <algorithm> #inclu...
  • HelloWorld10086
  • HelloWorld10086
  • 2015-02-25 19:43
  • 358

uva 10280 Old Wine Into New Bottles 有剪枝的完全背包

uva 10280 1、这道题如果直接把每个酒瓶的可用容量来做完全背包的话会超时,但是由最低的容量不低于95%,最高的容量不超过99%,由于容量的连续性有一些规律可循,可藉此优化:    考虑任意一种瓶子能够将酒全装满的情况,最小容量min,最大容量max,只要酒的体...
  • yan_____
  • yan_____
  • 2013-03-14 01:47
  • 1224

UVA 10280 Old Wine Into New Bottles(dp完全背包)

Problem C: Old Wine Into New Bottles Wine bottles are never completely filled: a small amount of air must be left in the neck to allow for thermal ...
  • u011217342
  • u011217342
  • 2013-09-25 21:42
  • 1210

uva10280 - Old Wine Into New Bottles

#include #include #include #include #include #include #include #define inf 0x7fffffff #define N 450000 #define MIN 1e-11 #define M 100 #define LL lon...
  • sunbaofeng2
  • sunbaofeng2
  • 2012-09-17 10:56
  • 248
    个人资料
    • 访问:813727次
    • 积分:16503
    • 等级:
    • 排名:第743名
    • 原创:804篇
    • 转载:209篇
    • 译文:0篇
    • 评论:72条
    博客专栏
    文章分类
    最新评论