简单背包问题

设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1w2w3,…wn 

问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S 

如果有满足条件的选择,则此背包有解,否则此背包问题无解。

输入

输入数据有多行,包括放入的物品重量为s,物品的件数n,以及每件物品的重量(输入数据均为正整数)

多组测试数据。

输出

对于每个测试实例,若满足条件则输出“YES”,若不满足则输出“NO“

样例输入

20 5 1 3 5 7 9

样例输出

YES
#include <stdio.h>
#include <iostream>
using namespace std;
int bag[1000];
int dongtaiguihua(int s,int n)
{
    if(s==0)
    {
        return 1;
    }
    else if(s<0 || (s>0 && n==0))
    {
        return 0;//东西还没装完,已经没有剩余物件了;
    }
    else if(dongtaiguihua(s-bag[n],n-1))
    {
        return 1;
    }
    else
    {
        return dongtaiguihua(s,n-1);
    }
}
int main()
{
    int s,n;
    while(cin>>s>>n)
    {
        for(int i=1;i<=n;i++)
            cin>>bag[i];
        if(dongtaiguihua(s,n)==0)
        {
            cout<<"NO";
        }
        else
        {
            cout<<"YES";
        }
        cout<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42103959/article/details/80764102