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;
    }
     
  • 相关阅读:
    WordCount的程序设计没写出来怎么办
    小程序分析
    程序单元测试
    Visual studio 2013安装
    四则运算源代码
    在VC环境下执行代码出现错误
    微点评微信软件
    软件工程学习
    查找抄袭文章
    软件附加题简答
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11172509.html
Copyright © 2011-2022 走看看