列表

详情


WY52. 牛牛的背包问题

描述

牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为w。
牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。
牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也算一种放法)。

输入描述

输入包括两行
第一行为两个正整数n和w(1 <= n <= 30, 1 <= w <= 2 * 10^9),表示零食的数量和背包的容量。
第二行n个正整数v[i](0 <= v[i] <= 10^9),表示每袋零食的体积。

输出描述

输出一个正整数, 表示牛牛一共有多少种零食放法。

示例1

输入:

3 10
1 2 4

输出:

8

说明:

三种零食总体积小于10,于是每种零食有放入和不放入两种情况,一共有2*2*2 = 8种情况。

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2019-09-04

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{
    int fun(int n,int w,int *p);
    int n;
    int *p;
    long long sum=0,w;
    long long count;
    scanf("%d%d",&n,&w);   
    p=(int*)malloc(n*sizeof(int));
    for(int i=0;i<n;i++)
        scanf("%d",(p+i));
    for(int j=0;j<n;j++)
        sum=sum+*(p+j);
    if(sum<=w)
    {
        count=pow(2,n);
    }
    else
    {
        count=fun(n-1,w,p);
    }
    printf("%lld",count);
    return 0;
}
int fun(int n,int w,int *p)
{
    if(w<0)
    {
        return 0;
    }
    else if(n==0)
    {
        if(*(p+n)>w)
        {
            return 1;
        }
        else
            return 2;
    }
    return fun(n-1,w,p)+fun(n-1,w-*(p+n),p);
}

C 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2019-06-28

#include <stdio.h>
#include <stdlib.h>
 int *v;
long long p(int n)
{
    if(n==0)
        return 1;
    return 2*p(n-1);
}
 long long f(int i, long long w)
{
    if(w<=0)
        return 0;
    if(i==1)
    {
        if(w>=v[1])
            return 2;
        else
            return 1;
    }
       
   return f(i-1,w)+f(i-1,w-v[i]);
}
int main()
{
    int n,i;
    long long w,num,wigh;
   num=0;
    wigh=0;
    scanf("%d %lld",&n,&w);
    v=(int *)malloc(sizeof(int)*(n+1));
    for(i=1;i<=n;i++)
    {
        scanf("%d",v+i);
        wigh=wigh+v[i];
    }
    if(wigh<=w)
        num=p(n);
        else
    num=f(n,w);
    printf("%lld",num);
    return 0;
    
}

上一题