hdu2159-完全背包

来源:互联网 发布:4行4列矩阵的值怎么求 编辑:程序博客网 时间:2024/06/15 23:07

这题就是比普通的完全背包多了一个个数的判断,我用一个num[ maxn ] 来记录个数,并用它来控制 f[  ]的更新:if(num[v]>=m)continue;f[v]<f[v-c[i]]+w[i]&&num[v-c[i]]<s;即这两句来实现控制;下面就直接上代码:

#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int maxn=105;const int Maxn=105;int f[maxn];int c[Maxn],w[maxn];int num[maxn];int main(){    //freopen("int.txt","r",stdin);    int n,m,k,s;    while(~scanf("%d%d%d%d",&n,&m,&k,&s)){        for(int i=0;i<k;i++)            scanf("%d%d",&w[i],&c[i]);        memset(f,0,sizeof(f));        memset(num,0,sizeof(num));        for(int i=0;i<k;i++)            for(int v=c[i];v<=m;v++){                if(num[v]>=m)continue;                if(f[v]<f[v-c[i]]+w[i]&&num[v-c[i]]<s){                    f[v]=f[v-c[i]]+w[i];                    num[v]=num[v-c[i]]+1;                }            }        int mv=0;        for(int v=m;v>=0;v--){            if(f[v]>=n)mv=v;        }        printf("%d\n",mv?m-mv:-1);    }    return 0;}


0 0