zoukankan      html  css  js  c++  java
  • 【POJ3093】Margaritas on the River Walk [动规 背包]

    POJ - 3093

    问有多少种方案使得无法装入剩下的任意一个物品

    一眼看过去 嘻嘻普通一维背包嘛 记录一个最小的物品然后加上就好

    样例一跑 emmmmmm 仔细一看 没那么简单QAQ 是道好题

    不能再装即=最小的也装不进去 枚举不在背包中的最小值 然后比它小的肯定都装进去了 比它大的装不进去

    好像就没有像清楚过为什么要从后往前或者从前往后扫 后面几天进行清理

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    #define ll long long
    #define rg register
    #define lson o<<1
    #define rson o<<1|1
    const int N=2000+5,M=200000+5,inf=0x3f3f3f3f,P=19650827;
    int n,m,T,a[N],sum[N],f[N],mn,ans;
    template <class t>void rd(t &x){
        x=0;int w=0;char ch=0;
        while(!isdigit(ch)) w|=ch=='-',ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        x=w?-x:x;
    }
    
    int main(){
        freopen("in.txt","r",stdin);
        rd(T);
        for(int t=1;t<=T;++t){
            memset(f,0,sizeof(f));
            rd(n),rd(m),mn=inf,ans=sum[0]=0,f[0]=1;
            for(int i=1;i<=n;++i) rd(a[i]);
            sort(a+1,a+n+1);
            for(int i=1;i<=n;++i) sum[i]=sum[i-1]+a[i];
            for(int i=n;i>=1;--i)
            for(int v=m;v;--v){
                if(v-sum[i-1]>=0&&v>m-a[i]) ans+=f[v-sum[i-1]];//加上sum[i-1]的贡献 
            //比它小的都放进去了  比它大的放不进去  
                if(v>=a[i]) f[v]+=f[v-a[i]];//统计 
                }
            printf("%d %d
    ",t,ans);
        }
        return 0;
    }
     
  • 相关阅读:
    CF763C Timofey and Remoduling
    CF762E Radio Stations
    CF762D Maximum Path
    CF763B Timofey and Rectangles
    URAL1696 Salary for Robots
    uva10884 Persephone
    LA4273 Post Offices
    SCU3037 Painting the Balls
    poj3375 Network Connection
    Golang zip压缩文件读写操作
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11172509.html
Copyright © 2011-2022 走看看