poj 3093

来源:互联网 发布:我国经济数据 编辑:程序博客网 时间:2024/06/05 22:44

Poj3093 (背包)

题目大意:有V件物品,每件物品有大小,有一个大小为D的背包,求极大背包方案数
思路:枚举剩下的物品是什么,小于它的一定会选择,大于的做背包
一个优化:从大到小枚举

#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)using namespace std;typedef long long ll;const int N=1e3+10;int v[N],d,n,T,kase;ll f[N],sum;ll solve(){    if(v[1]>d) return 0;    ll ans=0;    for(int i=n;i>=1;i--) {        sum-=v[i];        for(int j=0;j<v[i]&&d-sum-j>=0;j++) ans+=f[d-sum-j];        for(int j=d;j>=v[i];j--) f[j]+=f[j-v[i]];     }    return ans;}int main(){    scanf("%d",&T);    while(T--)     {        memset(f,0,sizeof(f));        sum=0; f[0]=1;        scanf("%d%d",&n,&d);        fo(i,1,n) {scanf("%d",&v[i]);sum+=v[i];}        sort(v+1,v+1+n);        printf("%d %lld\n",++kase,solve());     }    return 0;} 
原创粉丝点击