1. 程式人生 > >洛谷P3092 [USACO13NOV]沒有找零No Change

洛谷P3092 [USACO13NOV]沒有找零No Change

stop ins 1+n 有關 art nbsp out mount lar

P3092 [USACO13NOV]沒有找零No Change

題目描述

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(1 <= K <= 16)個硬幣,面值的範圍是1..100,000,000。

約翰想按順序買 N個物品(1 <= N <= 100,000),第i個物品需要花費c(i)塊錢,(1 <= c(i) <= 10,000)。

在依次進行的購買N個物品的過程中,約翰可以隨時停下來付款,每次付款只用一個硬幣,支付購買的內容是從上一次支付後開始到現在的這些所有物品(前提是該硬幣足以支付這些物品的費用)。不幸的是,商場的收銀機壞了,如果約翰支付的硬幣面值大於所需的費用,他不會得到任何找零。

請計算出在購買完N個物品後,約翰最多剩下多少錢。如果無法完成購買,輸出-1

輸入輸出格式

輸入格式:

  • 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.

輸出格式:

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

輸入輸出樣例

輸入樣例#1:
3 6 
12 
15 
10 
6 
3 
3 
2 
3 
7 
輸出樣例#1:
12 

說明

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.

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.

/*
    因為是順序購買,所以狀態s的答案有關的是使用順序。之後就有狀態f[s]表示用狀態s最多可買多少物品。最後因為是金組的T3所以一定要有坑,在算狀態最大值的時候要套一個二分。
*/
#include<iostream>
#include<cstdio>
using namespace std;
int k,n;//k個硬幣,n個物品 
int s[100010],a[20],f[1<<16],ans=-1;
int find(int l,int r,int x){
    int p=l,res=l,mid;
    while(l<=r){
        mid=(l+r)>>1;
        if(s[mid]-s[p]<=a[x])res=mid,l=mid+1;
        else r=mid-1;
    }
    return res;
}
int zhao_ling(int x){
    int res=0;
    for(int i=0;i<k;i++)
        if((x&(1<<i))==0)res+=a[i+1];
    return res;
}
int main(){
    freopen("Cola.txt","r",stdin);
    scanf("%d%d",&k,&n);
    for(int i=1;i<=k;i++)scanf("%d",&a[i]);
    int x;
    for(int i=1;i<=n;i++){
        scanf("%d",&x);
        s[i]=s[i-1]+x;
    }
    for(int sta=1;sta<(1<<k);sta++){
        int mx=0;
        for(int i=1;i<=k;i++){
            if(sta&(1<<(i-1))){
                int tmp=f[sta-(1<<(i-1))];
                mx=max(mx,find(tmp,n,i));
            }
        }
        f[sta]=mx;
        if(mx==n)ans=max(ans,zhao_ling(sta));
    }
    printf("%d",ans);
}

洛谷P3092 [USACO13NOV]沒有找零No Change