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