题目:
题目描述
楚继光扬扬得意道:“当日华山论剑,先是他用黯然销魂掌破了我的七十二路空明拳,然后我改打降龙十八掌,却不防他伸开食指和中指,竟是六脉神剑,又胜我一筹。可见天下武学彼此克制,武学之道玄之又玄!……哎,谁用炒锅敲我头?”
楚继光的老妈大声骂道:“玩个石头剪刀布都说得这般威风,炒菜没油了,快给我去装!”
“这么凶干嘛?不就吹吹牛嘛。”楚继光边嘟嘟囔囔边走进储藏室,看到储藏室有N(N<=20)个油桶都装 满了油,这N个油桶容积各不相同(容积为整数),楚继光需要M(M<=20)升油(M也为整数),请你不借助任何其他容器,判断能否直接在N桶油中取任意K桶 (1≤K≤N)油,其油的总量正好是M升,如果可以,就输出yes,否则输出no。
输入输出格式
输入格式:
第一行为两个整数N,M,第二行为N个整数,即油桶的容积。
输出格式:
输出结果即yes或者no。
输入输出样例
输入样例#1:
5 10
1 2 3 1 1
输出样例#1:
no
思路:一个非常正的完全背包。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 20
#define read(x) scanf("%d",&x)
int n,m;
int a[maxn+5];
bool f[maxn+5];
int main() {
read(n),read(m);
for(int i=1;i<=n;i++) read(a[i]);
f[0]=true;
for(int i=1;i<=n;i++) {
for(int j=m;j>=1;j--) {
if(j>=a[i]) f[j]|=f[j-a[i]];
}
}
if(f[m]) printf("yes");
else printf("no");
return 0;
}
···