苹果
时间限制:3000 ms | 内存限制:65535 KB
难度:2
- 描述
-
ctest有n个苹果,要将它放入容量为v的背包。给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值。
- 输入
- 有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n、v同时为0时结束测试,此时不输出。接下来的n行,每行2个正整数,用空格隔开,分别代表苹果的大小c和价钱w。所有输入数字的范围大于等于0,小于等于1000。
- 输出
- 对每组测试数据输出一个整数,代表能放入背包的苹果的总价值。
- 样例输入
-
3 3 1 1 2 1 3 1 0 0
- 样例输出
-
2
1 #include<stdio.h> 2 int max(int a,int b) 3 { 4 return a>b?a:b; 5 } 6 int main() 7 { 8 int i,j,n,v,c,w; 9 while(scanf("%d%d",&n,&v),n||v) 10 { 11 int b[1001]={0}; 12 for(i=1;i<=n;i++) 13 { 14 scanf("%d%d",&c,&w); 15 for(j=v;j>=c;j--) 16 b[j]=max(b[j-c]+w,b[j]); 17 } 18 printf("%d\n",b[v]); 19 } 20 }
1 2 #include <iostream> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 using namespace std; 7 8 int f[1010][1010] = {0}; 9 10 int main() 11 { 12 int i,j,k; 13 int n,cap; 14 while(cin>>n>>cap,n||cap) 15 { 16 memset(f,0,sizeof(f)); 17 int c,v; 18 for(i=1; i<=n; i++) 19 { 20 cin>>c>>v; 21 for(j=0; j<=cap; j++)//从0开始 22 { 23 f[i][j] = f[i-1][j]; 24 if(j>=c)//不加的话可能j-c就溢出了 ,而且是wa 25 if(f[i][j]<(f[i-1][j-c] + v))//小于符号,不是大于 26 f[i][j] = f[i-1][j-c] + v; 27 } 28 } 29 cout<<f[n][cap]<<endl; 30 } 31 return 0; 32 } 33