Potato Sacks
Time Limit: 1 Sec Memory Limit: 128 Mb
题目链接http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2270
Description
Potato sacks come in different weight capacities (specified in pounds). Potatoes come in different weights. If you are given some number of potatoes of possibly different weights (specified in pounds), determine if it is possible to exactly fill a potato sack of a given capacity using some or all of the potatoes.
Input
The first line of input contains a single decimal integer P,(1 ≤ P ≤ 100), which is the number of data sets that follow. Each data set should be processed identically and independently. Each data set consists of a single line of input containing 12 space separated positive integers. They are the data set number, K, followed by the capacity, C, of the potato sack in pounds, 10 ≤ C ≤ 30, followed by the weights of 10 potatoes in pounds. A potato will not weigh more than 3 pounds.
Output
For each data set there is a single line of output. The output line consists of the data set number,K, followed by a single space, the word YES if the potato sack can be filled exactly to capacity C pounds or the word NO if it cannot be filled exactly
Sample Input
2
1 20 3 2 1 3 3 2 3 2 1 1
2 25 3 3 3 3 3 3 3 3 3 3
Sample Output
1 YES
2 NO
题目大意是这样的:给你t组数据每行12个数字,第一个是编号,第二个是背包大小,接下来十个是马铃薯的重量,询问是否有一种方法能恰好装满背包。
emmm。。。这题没什么好说的,01背包裸题,学过01背包的应该知道怎么做了,没学过的可以看我普通dp专题里的01背包哦(* ^ ▽^ *)。我们将重量和价值画个等于号就行了,最后判断dp[v]是否等于v就行了。
#include <cstdio>
#include <cstring>
using namespace std;
int a[15], c[40];
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int t, n, id, v;
scanf("%d", &t);
for (int o = 1; o <= t; o++) {
scanf("%d%d", &id, &v);
memset(c,0,sizeof(c));
for (int i = 1; i <= 10; i++) {
scanf("%d", &a[i]);
}
printf("%d ", o);
for (int i = 1; i <= 10; i++) {
for (int j = v; j >= a[i]; j--)
c[j] = max(c[j], c[j - a[i]] + a[i]);
}
if (c[v] == v) printf("YES\n");
else printf("NO\n");
}
return 0;
}