zoukankan      html  css  js  c++  java
  • bzoj3312: [Usaco2013 Nov]No Change

    题意:

    K个硬币,要买N个物品。K<=16,N<=1e5

    给定买的顺序,即按顺序必须是一路买过去,当选定买的东西物品序列后,付出钱后,货主是不会找零钱的。现希望买完所需要的东西后,留下的钱越多越好,如果不能完成购买任务,输出-1

    =>K那么小。。。那么我们可以想到二进制枚举状态。。。然后转移。。。好像算不上状压dp吧。。。时间复杂度O(K2^Klogn)

    #include<cstdio>
    #include<cstring>
    #include<cctype>
    #include<algorithm>
    using namespace std;
    #define rep(i,s,t) for(int i=s;i<=t;i++)
    #define dwn(i,s,t) for(int i=s;i>=t;i--)
    #define clr(x,c) memset(x,c,sizeof(x))
    int read(){
    	int x=0;char c=getchar();
    	while(!isdigit(c)) c=getchar();
    	while(isdigit(c)) x=x*10+c-'0',c=getchar();
    	return x;
    }
    const int nmax=20;
    const int maxn=1e5+5;
    const int inf=0x7f7f7f7f;
    int a[nmax],b[maxn],dp[maxn],n,m,sm;
    int find(int x,int eo){
    	if(x==m) return 0;
    	int l=x,r=m,ans=0,mid;
    	while(l<=r){
    		mid=(l+r)>>1;
    		if(b[mid]-b[x]<=eo) ans=mid,l=mid+1;
    		else r=mid-1;
    	}
    	return ans-x;
    }
    int main(){
    	n=read(),m=read(),sm=0;
    	rep(i,1,n) a[i]=read(),sm+=a[i];
    	rep(i,1,m) b[i]=read()+b[i-1];
    	int se=(1<<n)-1,tm=0,ans=-1;
    	rep(i,1,se){
    		tm=0;
    		rep(j,1,n) if(i&(1<<(j-1))) dp[i]=max(dp[i],dp[i-(1<<(j-1))]+find(dp[i-(1<<j-1)],a[j])),tm+=a[j];
    		if(dp[i]==m) ans=max(ans,sm-tm);
    		//printf("%d:%d
    ",i,dp[i]);
    	}
    	printf("%d
    ",ans);return 0;
    }
    

      

    3312: [Usaco2013 Nov]No Change

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 177  Solved: 113
    [Submit][Status][Discuss]

    Description

    Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 <= K <= 16), each with value in the range 1..100,000,000. FJ would like to make a sequence of N purchases (1 <= N <= 100,000), where the ith purchase costs c(i) units of money (1 <= c(i) <= 10,000). As he makes this sequence of purchases, he can periodically stop and pay, with a single coin, for all the purchases made since his last payment (of course, the single coin he uses must be large enough to pay for all of these). Unfortunately, the vendors at the market are completely out of change, so whenever FJ uses a coin that is larger than the amount of money he owes, he sadly receives no changes in return! Please compute the maximum amount of money FJ can end up with after making his N purchases in sequence. Output -1 if it is impossible for FJ to make all of his purchases.

    K个硬币,要买N个物品。

    给定买的顺序,即按顺序必须是一路买过去,当选定买的东西物品序列后,付出钱后,货主是不会找零钱的。现希望买完所需要的东西后,留下的钱越多越好,如果不能完成购买任务,输出-1

    Input

    Line 1: Two integers, K and N.

    * Lines 2..1+K: Each line contains the amount of money of one of FJ's coins.

    * Lines 2+K..1+N+K: These N lines contain the costs of FJ's intended purchases. 

    Output

    * Line 1: The maximum amount of money FJ can end up with, or -1 if FJ cannot complete all of his purchases.

    Sample Input

    3 6
    12
    15
    10
    6
    3
    3
    2
    3
    7

    INPUT DETAILS: FJ has 3 coins of values 12, 15, and 10. He must make purchases in sequence of value 6, 3, 3, 2, 3, and 7.

    Sample Output

    12
    OUTPUT DETAILS: FJ spends his 10-unit coin on the first two purchases, then the 15-unit coin on the remaining purchases. This leaves him with the 12-unit coin.

    HINT

     

    Source

  • 相关阅读:
    jquery的图片异步加载
    thinkphp3.1的验证码
    android的edittext设置输入限制,只能输入数字
    android,安卓get请求的提交以及我遇到的异常
    android安卓开发基础小笔记,添加按钮事件,打开新窗体,窗体传值,回传
    php正则表达式函数
    php对浮点数小数取整,php除法取整数
    php数组全排列,元素所有组合
    javascript数组全排列,数组元素所有组合
    spring 配置中相关属性的含义:
  • 原文地址:https://www.cnblogs.com/fighting-to-the-end/p/6036553.html
Copyright © 2011-2022 走看看