F 多重背包 判断能否刚好装满

Description

有n种不同大小的数字,每种各个。判断是否可以从这些数字之中选出若干使它们的和恰好为K。

Input

首先是一个正整数T(1<=T<=100)
接下来是T组数据
每组数据第一行是一个正整数n(1<=n<=100),表示有n种不同大小的数字
第二行是n个不同大小的正整数ai(1<=ai<=100000)
第三行是n个正整数mi(1<=mi<=100000),表示每种数字有mi个
第四行是一个正整数K(1<=K<=100000)

Output

对于每组数据,如果能从这些数字中选出若干使它们的和恰好为K,则输出“Yes”,否则输出“No”,每个输出单独占一行

Sample Input

2
3
3 5 8
3 2 2
17
2
1 2
1 1
4

Sample Output

Yes
No

 1 # include <cstdio>
 2 # include <cstring>
 3 # define LL long long
 4 using namespace std ;
 5
 6 int n , k ;
 7 int w[100010] ;
 8 int num[100010] ;
 9 int dp[100010] ;
10
11 int main ()
12 {
13    // freopen("in.txt","r",stdin) ;
14     int T ;
15     scanf("%d" , &T) ;
16     while (T--)
17     {
18         scanf("%d" , &n) ;
19         int i , j ;
20         for (i = 0 ; i <n ; i++)
21             scanf("%d" , &w[i]) ;
22         for (i = 0 ; i <n ; i++)
23             scanf("%d" , &num[i]) ;
24         scanf("%d" , &k) ;
25         memset(dp , -1 , sizeof(dp)) ;
26         dp[0] = 0 ;
27         for (i = 0 ; i < n ;i++)
28         {
29             for (j = 0 ; j <=k ; j++)
30             {
31                 if (dp[j] >= 0)
32                     dp[j] = num[i] ;
33                 else if (j < w[i] || dp[j - w[i]] <= 0)
34                     dp[j] = -1 ;
35                 else
36                     dp[j] = dp[j - w[i]] - 1 ;
37             }
38         }
39         if (dp[k] >= 0)
40             printf("Yes\n") ;
41         else
42             printf("No\n") ;
43     }
44
45
46
47     return 0 ;
48 }

时间: 2024-10-29 18:46:57

F 多重背包 判断能否刚好装满的相关文章

POJ3260——The Fewest Coins(多重背包+完全背包)

The Fewest Coins DescriptionFarmer John has gone to town to buy some farm supplies. Being a very efficient man, he always pays for his goods in such a way that the smallest number of coins changes hands, i.e., the number of coins he uses to pay plus

多重背包并判断能否装满(附01完全背包思想)

这是我们作业上的一道题,也是我认为挺好玩的一道题,是裸的多重背包,不过它只是单纯的让我判断能否装满.我第一次交TLE了,我以为作业题的数据不会很强,干脆偷了个懒枚举了下选的个数,没有二进制优化直接超时了,低估出题老师了~所以我又加上了二进制优化,经历一番坎坷才过. 关于这个背包的知识,我想多说一点,毕竟越是基础的东西越是要加强理解啊…… 首先,说01和完全背包,这两个都是很基础的背包,他们两个的区别在于是由当前状态转移而来还是由上一个状态转移而来,由当前状态转移而来代表可是选无数个,就是完全背包

TOJ礼品兑换 (多重背包恰好装满)

近期crq老师为了提高各个学生对ACM的兴趣,在TOJ上增加了积分制度和礼品兑换功能, TOJ的积分是来之不易的,固然同学们都想用同一积分换取最大价值的礼品,某同学用了M的积分换取了一些礼品. 请问:他用M的积分最多能换取多少价值的礼品呢? (积分M一定要使用完) 输入 输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数M和N(1<=M<=1000,1<=N<=100),分别表示换取的总积分和礼品的种类,然后是N行数据,每行包含3个数p,h和c(1&l

DP大作战——多重背包

题目描述 在之前的上机中,零崎已经出过了01背包和完全背包,也介绍了使用-1初始化容量限定背包必须装满这种小技巧,接下来的背包问题相对有些难度,可以说是01背包和完全背包的进阶问题. 多重背包:物品可以有0-n件. 对于第i种物品,我们有取0件,1件…n [ i ] 件共n [ i ] +1种策略,状态转移方程为f [ i ] [ v ] = max { f [ i - 1 ] [ v - k × c [ i ] ] + k × w [ i ] | 0 <=k<= n [ i ] }.在这里,

POJ1276Cash Machine[多重背包可行性]

Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 32971   Accepted: 11950 Description A Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a requested cash amount. The m

HDU5677 manacher + 二维多重背包

附上题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5677 问题描述 ztr喜欢研究子串,今天,他有n个串 现在ztr想知道,能否从这n个串的所有回文子串中, 取出恰好k个回文串且满足这些回文串的长度之和为L 以yjqqaq为例 这个串包含的回文子串有 y,j,q,a,q,qq,qaq 所以我们可以既选qq,又选qaq 输入描述 有T组数据,第一行为一个正整数T(T<=10)T(T<=10) 每组数据第一行为三个正整数N(1<=N<

ycb的ACM进阶之路 二进制多重背包

ycb的ACM进阶之路 发布时间: 2017年5月22日 14:30   最后更新: 2017年5月22日 14:31   时间限制: 1000ms   内存限制: 128M 描述 ycb是个天资聪颖的孩子,他的梦想是成为世界上最伟大的ACMer.为此,他想拜附近最有威望的dalao为师.dalao为了判断他的资质,给他出了一个难题.dalao把他带到一个到处都是题的oj里对他说:“孩子,这个oj里有一些不同的题,做每一道题都需要一些时间,每一题也有它自身的rp(人品值).我会给你一段时间,在这

【动态规划】背包问题(一) 01背包 完全背包 多重背包

一.01背包 有N件物品和一个容量为V的背包.第i件物品的价格(即体积,下同)是w[i],价值是c[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 这是最基础的背包问题,总的来说就是:选还是不选,这是个问题<( ̄ˇ ̄)/ 相当于用f[i][j]表示前i个背包装入容量为v的背包中所可以获得的最大价值. 对于一个物品,只有两种情况 情况一: 第i件不放进去,这时所得价值为:f[i-1][v] 情况二: 第i件放进去,这时所得价值为:f[i-1][v-c[i]]+w

HDU 1059 Dividing 分配(AC代码)多重背包的变形

1 #include <iostream> 2 using namespace std; 3 int num[6]; 4 int dp[200]; 5 bool divide(int sum) 6 { 7 int k,i,j; 8 for(i=0;i<6;i++) 9 for(k=0;k<num[i];k++) 10 for(j=sum;j>i;j--) 11 if(dp[j-(i+1)]+(i+1)>dp[j]) 12 dp[j]=dp[j-(i+1)]+(i+1);