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;
}

 

posted @ 2018-03-10 18:28  小小小的程序猿  阅读(270)  评论(0编辑  收藏  举报
window.onload = function(){ $("#live2dcanvas").attr("style","position: fixed; opacity: 0.7; left: 70px; bottom: 0px; z-index: 1; pointer-events: none;") }