背包的最简单的实践题目
Bone Collector
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 23125 Accepted Submission(s): 9387
Problem Description
Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …
The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?
Input
The first line contain a integer T , the number of cases.
Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.
Output
One integer per line representing the maximum of the total value (this number will be less than 231).
Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1
Sample Output
14
#include <cstring>
using namespace std;
int main()
{
int a[1010],f[1010];
int b[1010],n,m,k,i,j;
scanf("%d",&k);
while(k--)
{
memset(a,0,sizeof(a));//清零
memset(f,0,sizeof(f));
memset(b,0,sizeof(b));
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
scanf("%d",&b[i]);
for(i=0;i<n;i++)//01背包的具体实现过程
{
for(j=m;j>=b[i];--j)
{
if(f[j]<f[j-b[i]]+a[i])
{
f[j]=f[j-b[i]]+a[i];
}
}
}
printf("%d\n",f[m]);
}
return 0;
}
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
01背包的具体实现过程及代码
#include<iostream>
#define MAX 1111
using namespace std;
int f[MAX],n,m,v,w;
int main(){
cin>>n>>m;//n表示个数,m表示背包容量
for(int i=1;i<=n;++i){
cin>>v>>w;//v=价值,w=重量
for(int j=m;j>=w;--j)
if(f[j]<f[j-w]+v)
{
f[j]=f[j-w]+v;
cout<<f[j];
cout<<"\t";
}
}
cout<<f[m]<<'\n';
return 0;
}
/**
5 12
1 2
4 5
5 6
7 8
5 2
**/
背包的过程实现如下
12 11 10 9 8 7 6 5 4 3 2 1 0
1 1 1 1 1 1 1 1 1 1 1 0 0 (1,2)
5 5 5 5 5 5 4 4 (4,5)
9 9 6 6 6 5 5 (5,6)//倒数第二个5不更新
8 8 8 7 7 (7,8)//前两个8不更新
13 12 12 10 10 9 6 6 6 5 5 (5,2)
Bone Collector
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 23125 Accepted Submission(s): 9387
Problem Description
Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …
The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?
Input
The first line contain a integer T , the number of cases.
Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.
Output
One integer per line representing the maximum of the total value (this number will be less than 231).
Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1
Sample Output
14
下边是代码实现
#include <iostream>
#include <cstdio>#include <cstring>
using namespace std;
int main()
{
int a[1010],f[1010];
int b[1010],n,m,k,i,j;
scanf("%d",&k);
while(k--)
{
memset(a,0,sizeof(a));//清零
memset(f,0,sizeof(f));
memset(b,0,sizeof(b));
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
scanf("%d",&b[i]);
for(i=0;i<n;i++)//01背包的具体实现过程
{
for(j=m;j>=b[i];--j)
{
if(f[j]<f[j-b[i]]+a[i])
{
f[j]=f[j-b[i]]+a[i];
}
}
}
printf("%d\n",f[m]);
}
return 0;
}
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
01背包的具体实现过程及代码
#include<iostream>
#define MAX 1111
using namespace std;
int f[MAX],n,m,v,w;
int main(){
cin>>n>>m;//n表示个数,m表示背包容量
for(int i=1;i<=n;++i){
cin>>v>>w;//v=价值,w=重量
for(int j=m;j>=w;--j)
if(f[j]<f[j-w]+v)
{
f[j]=f[j-w]+v;
cout<<f[j];
cout<<"\t";
}
}
cout<<f[m]<<'\n';
return 0;
}
/**
5 12
1 2
4 5
5 6
7 8
5 2
**/
背包的过程实现如下
12 11 10 9 8 7 6 5 4 3 2 1 0
1 1 1 1 1 1 1 1 1 1 1 0 0 (1,2)
5 5 5 5 5 5 4 4 (4,5)
9 9 6 6 6 5 5 (5,6)//倒数第二个5不更新
8 8 8 7 7 (7,8)//前两个8不更新
13 12 12 10 10 9 6 6 6 5 5 (5,2)