NYOJ 289

 

苹果

时间限制: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         
原文地址:https://www.cnblogs.com/hxsyl/p/3045767.html