多重背包经典列题hdu2844coins

来源:互联网 发布:unity3d 雷达图 编辑:程序博客网 时间:2024/05/20 04:28

题目连接地址

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<algorithm>#include<queue>using namespace std;#define LL long longconst int mn = 1100100;int dp[mn];bool vis[mn];int value[1111],num[1111];void zeroonepack(int value , int num , int sum ){    value = value * num;    for(int i = sum ; i >= value ; i--)dp[i] = max(dp[i] , dp[i-value] + value);}void compeletepack(int value , int sum){    for(int i = value ; i <= sum ; i++)dp[i] = max(dp[i] , dp[i-value] + value);}void solve(int value[] , int num[] ,int n , int sum){    for(int i = 1 ; i <= n ; i++)    {        if(value[i] * num[i] >= sum)          compeletepack(value[i],sum);        else        {            int k = 1;            while(k <= num[i])            {                zeroonepack(value[i],k,sum);                num[i] -= k;                k *= 2;            }            zeroonepack(value[i],num[i] ,sum);        }    }}int main(){    int m,n;    while(scanf("%d%d",&n,&m) && (n || m))    {        for(int i = 1 ; i <= n ; i++)scanf("%d",&value[i]);        for(int i = 1 ; i <= n ; i++)scanf("%d",&num[i]);        for(int i = 1 ; i <= m ; i++)dp[i] = 0;        dp[0] = 0;        solve(value,num,n,m);        int ans = 0;        memset(vis,0,sizeof(vis));        for(int i = 1 ; i <= m ; i++)        {            if(dp[i] == i)            ans++;        }       // for(int i = 1 ; i <= m ; i++)if(vis[i])ans++;        printf("%d\n",ans);    }}


原创粉丝点击