ACM-小偷的背包

Posted 小小小的程序媛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM-小偷的背包相关的知识,希望对你有一定的参考价值。

题目描述:小偷的背包
 
设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,...,wn。问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S。如果有满足条件的选择,则此背包有解,否则此背包问题无解。

输入

第一行为物品重量S(整数);
第二行为物品数量n, 
第三行为n件物品的重量的序列。

输出

有解就输出”yes!“,没有解就输出”no!“。

样例输入

20
5
1 3 5 7 9

样例输出

yes!

思路:水题,直接DFS即可。

// 小偷的背包.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


#include<iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

const int MAX = 100;
int s, n,flag, w[MAX];

void DFS(int pos,int cost)
{
    //cout << "pos:" << pos << "\tcur.len:" << cur.len << "\tcur.cost:" << cur.cost << endl;

    if (cost == s)
    {
        flag = 1;
        return;
    }

    if (pos > n) return;

    DFS(pos + 1, cost + w[pos]);

    DFS(pos + 1, cost);

}

int main()
{
    int sum = 0;
    cin >> s >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> w[i];
        sum += w[i];
    }

    if (sum < s) { cout << "no!"; return 0; }

    flag = 0;    
    DFS(0, 0);

    if (flag) cout << "yes!";
    else cout << "no!";


    return 0;
}

 

以上是关于ACM-小偷的背包的主要内容,如果未能解决你的问题,请参考以下文章

动态规划:小偷的背包

动态规划:小偷的背包

小偷的背包(0963)

偷东西的学问-背包问题

偷东西的学问-背包问题

Robberies 01背包变形 hdoj