以下题目还没有找到题目描述,先附上代码。
//Juice完全背包,求的是最小值
要在初始化时将临时数组f赋值为最大值,并f[0]=0;这样改变下循环判断条件
最后如果不能完全匹配,也就是f[最大值]不变,便输出不可能。
1 #include <stdio.h>
2 #define min(a,b) a<b?a:b
3 int T,N,E,F;
4 int cost[10005],powderP[505],powderW[505];
5
6 int main(void){
7 freopen("input.txt", "r", stdin);
8 setbuf(stdout, NULL);
9 scanf("%d", &T);
10 for(int test_case = 1; test_case <= T; test_case++){
11 scanf("%d %d %d", &E, &F, &N);
12 for(int j=1;j<=F-E;j++)
13 cost[j]=0x3FFFFFFF;
14 cost[0]=0;
15 for(int i=0;i<N;i++)
16 scanf("%d %d", &powderP[i], &powderW[i]);
17 for(int i=0;i<N;i++){
18 for(int j=powderW[i];j<=F-E;j++){
19 cost[j]=min(cost[j],cost[j-powderW[i]]+powderP[i]);
20 }
21 }
22 if(cost[F-E]==0x3FFFFFFF)
23 printf("Case #%d\nimpossible\n", test_case, cost[F-E]);
24 else
25 printf("Case #%d\n%d\n", test_case, cost[F-E]);
26 }
27 return 0;
28 }
//Bone_Collector 0-1背包问题
1 #include <stdio.h>
2 #define max(a,b) (a>b?a:b)
3 int T,N,W,boneV[1005],boneW[1005];
4 int data[1005];//data[V][W]
5
6 int main(void){
7 scanf("%d", &T);
8 for(int test_case = 1; test_case <= T; test_case++){
9 scanf("%d %d", &N, &W);
10 for(int i=1;i<=W;i++)data[i]=0;
11 for(int i=0;i<N;i++)scanf("%d", &boneW[i]);
12 for(int i=0;i<N;i++)scanf("%d", &boneV[i]);
13
14 for(int j=0;j<N;j++){
15 for(int i=W;i>0;i--){
16 if(i<boneV[j])break;
17 if(data[i]<data[i-boneV[j]]+boneW[j])
18 data[i]=data[i-boneV[j]]+boneW[j];
19 }
20 }
21 printf("#%d %d\n", test_case, data[W]);
22 }
23 return 0;
24 }