在容量为m的背包里,问有多少种不超过m的装包方式(多重背包+枚举统计)

来源:互联网 发布:alexa mini软件 编辑:程序博客网 时间:2024/04/30 00:26

多组输入。

对于每组数据,第一行为两个整数n,m1 <= n <= 100,1 <= m <= 100000) 。

接下来的一行有n个整数Ai,n个整数Ci1 <= Ai <= 10000,1 <= Ci <= 1000) 。

文件的最后一行为两个0,代表输入结束。

输出

 

对于每组数据,输出一行,包含一个整数代表答案。

3 101 2 42 1 12 5 1 42 10 0

示例输出

84


#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define LL long long#define esp 1e9using namespace std;int s[100010],nu[100010];int dp[100010];int m;void com(int sp,int c){    for(int i=sp;i<=m;i++)    {        dp[i]=max(dp[i],dp[i-sp]+c);    }}void on(int sp,int c){    for(int i=m;i>=sp;i--)    {        dp[i]=max(dp[i],dp[i-sp]+c);    }}void muli(int num,int sp,int c){    if(sp*num>=m)    {        com(sp,c);        return;    }    int tem=1;    while(tem<=num)    {        on(tem*c,tem*sp);        num-=tem;        tem<<=1;    }    on(num*c,num*sp);}int main(){    int n,i,j,k;    while(~scanf("%d%d",&n,&m)&&n&&m)    {        memset(dp,0,sizeof(dp));        for(i=0;i<n;i++)            scanf("%d",&s[i]);        for(i=0;i<n;i++)            scanf("%d",&nu[i]);        for(i=0;i<n;i++)        {            muli(nu[i],s[i],s[i]);        }        int ans=0;        for(i=1;i<=m;i++)            if(dp[i]==i)                ans++;        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 兔子脖子歪了怎么办 爱奇艺游戏直播打不开怎么办 弄不到引产证明怎么办 小中考没过怎么办 学生对语文老师有意见怎么办 初三数学总是提不上怎么办 孩子数学太差怎么办 初一孩子学习不好怎么办 数学就是学不会怎么办 小猫太凶了怎么办 2个月狗狗感冒了怎么办 狗狗病了不吃东西怎么办 两个月小狗喝水怎么办 狗狗受凉拉稀怎么办 打篮球鼻子歪了怎么办 qq有个猫的表情怎么办 狗喝牛奶拉肚子怎么办 幼犬喝牛奶了怎么办 比基尼线有点黑怎么办 比基尼处皮肤黑怎么办 电脑桌面不显示图标怎么办 微信多人视频图像很小怎么办 人呆呆傻傻的怎么办 发烧冷的发抖怎么办 cad字体是问号怎么办 电脑打字框一直闪怎么办 主屏幕按钮失灵怎么办 孩子不优秀父母怎么办 同事不听你指挥怎么办 孩子常规太差怎么办 安全教案烫伤了怎么办 新生儿40天淘气怎么办 孩子不听老师讲课怎么办 孩子心理出现问题怎么办 打小孩脸打紫了怎么办 上夜班白天睡不好怎么办 实行两票制一品红会怎么办 ae合成素材丢失怎么办 百折裙褶子开了怎么办 touch马克笔干了怎么办 酒精马克笔干了怎么办