• 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

  • 相关阅读:
    python中Cmap的用法
    Js中 关于top、clientTop、scrollTop、offsetTop
    通过ByteArray来播放MP3
    JS中的call()和apply()方法
    flash 屏幕更新 Essential.ActionScript
    Aptana Studio 3 如何汉化,实现简体中文版
    Flash Builder更新Flash player版本
    随机不重复
    Aptana :调试 javascript 图解
    获取两个数组的相同元素或不相同的元素
  • 原文地址:https://www.cnblogs.com/fighting-to-the-end/p/6036553.html
Copyright © 2020-2023  润新知