可行性背包

来源:互联网 发布:mysql错误1054 编辑:程序博客网 时间:2024/06/16 22:59

可行性背包模板题

题目:poj1742
用一个dp[maxv]判断 <=m 那些值可以被组成。
用一个used[maxv] 来判断第i个数使用的次数。

//可行性背包#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<vector>using namespace std;const int maxn =  1e2+5;const int maxv = 1e5+5;int a[maxn],c[maxn];int used[maxv];int dp[maxv];int ans;int n,m;void Multiple_backpack(int val,int number){    memset(used,0,sizeof(used));    for(int i=val;i<=m;i++)    {        if(!dp[i] && dp[i-val] && used[i-val]<number)        {            used[i] = used[i-val] + 1;               dp[i] = 1;            ans++;        }    }}void solve(){    memset(dp,0,sizeof(dp));    dp[0] = 1;    for(int i=0;i<n;i++)    {        Multiple_backpack(a[i],c[i]);    }    printf("%d\n",ans);}int main(){    while(~scanf("%d%d",&n,&m)&& (n+m))    {        ans = 0;        for(int i=0;i<n;i++)scanf("%d",&a[i]);        for(int i=0;i<n;i++)scanf("%d",&c[i]);        solve();    }    return 0;}
原创粉丝点击