题意:
Description
小g得到一张满x减x的购物劵,他想在自己购物车中选择一部分物品来买,购物车里没种物品只能买一件,并且他想尽量少花钱。由于小g很穷很笨,如果它购物车里所有物品价值总和比x小,那么他只能选择放弃这张优惠劵
也就是说他会在n个物品中选若干,使得花费总和大于等于x且最小
问花费最少的钱能拿到货物的最大价值是多少?
Input
输入第一行是t(t <= 100),表示t组样例。接下来输入n和x (0 < n < 100, 0 < x < 10000),代表小g购物车有n件物品,优惠劵满x减x,接下来一行有n个数(0 < ai < 100)代表n个物品的价格
Output
对于每组样例,请输出“Case x: y”, x是输入样例组数,y是小g在花最少的钱能拿到货物的最大价值
Sample Input
2
3 10
1 2 3
3 10
5 6 3
Sample Output
Case 1: 0
Case 2: 11
思路:
01背包的变形题,dp【i】代表总价值为i的货物搭配是否存在(1存在,0不存在),然后从x开始遍历,若存在dp【i】则直接输出并跳出,不存在输出0
代码:
#include <stdio.h>
#include <string.h>
bool dp[10005];
int main() {
int T, tot = 0, a, n, x;
scanf("%d", &T);
while(T--) {
memset(dp, 0, sizeof(dp));
scanf("%d%d", &n, &x);
dp[0] = 1;
for (int i = 0; i < n; i++) {
scanf("%d", &a);
for (int j = i * 100; j >= 0; j--) {
if (dp[j]) {
dp[j + a] = 1;
}
}
}
int flag = 0;
for (int i = x; i <= n * 100; i++) {
if(dp[i]) {
flag = i;
break;
}
}
printf("Case %d: %d\n", ++tot, flag);
}
return 0;
}
如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢