描述
话说黑羽快斗(大家都知道吧)又一次成功潜入了某个博物馆,而眼前宝石的数量之多也是他事先未料到的。面对着数量如此多的珠宝,快斗在叹息自己带的背包太小之余,也在烦恼着该如何带走最大价值的宝石。
快斗很快就把宝石收集到了一起,对于每一枚宝石,快斗给出了它的价值。然而,并不是价值高的宝石就应该带走。由于有的宝石虽然价值很高,但是因为体积太大而占用了太多背包的位置。 而快斗希望他带走的宝石的总价值最大。这就要对宝石进行一些取舍。
由于宝石的数量过于巨大,即使以快斗的高智商也不能在很短的时间解决。好在快斗本身也是一个程序员,他决定用计算机帮助他计算他能带走的宝石的最大价值。
输入
多组测试数据。
每组数据3行:
第一行2个整数 n (0 <= n <=1000 ), w (0 <= w <=5000 )。表示宝石个数和背包空间。
第二行n个整数vi (i=1,2,……n),表示第i个宝石的价值。(0<= vi <=10000)
第三行n个整数ti (i=1,2,……n),表示第i个宝石的体积。(1<= ti <= w)
数据以-1 -1结束,不必输出结果。
输出
话说黑羽快斗(大家都知道吧)又一次成功潜入了某个博物馆,而眼前宝石的数量之多也是他事先未料到的。面对着数量如此多的珠宝,快斗在叹息自己带的背包太小之余,也在烦恼着该如何带走最大价值的宝石。
快斗很快就把宝石收集到了一起,对于每一枚宝石,快斗给出了它的价值。然而,并不是价值高的宝石就应该带走。由于有的宝石虽然价值很高,但是因为体积太大而占用了太多背包的位置。 而快斗希望他带走的宝石的总价值最大。这就要对宝石进行一些取舍。
由于宝石的数量过于巨大,即使以快斗的高智商也不能在很短的时间解决。好在快斗本身也是一个程序员,他决定用计算机帮助他计算他能带走的宝石的最大价值。
输入
多组测试数据。
每组数据3行:
第一行2个整数 n (0 <= n <=1000 ), w (0 <= w <=5000 )。表示宝石个数和背包空间。
第二行n个整数vi (i=1,2,……n),表示第i个宝石的价值。(0<= vi <=10000)
第三行n个整数ti (i=1,2,……n),表示第i个宝石的体积。(1<= ti <= w)
数据以-1 -1结束,不必输出结果。
输出
对每一组数据输出一个整数,即能够带走的最大价值。
样例输入
4 8
2 3 4 5
2 3 4 5
-1 -1
样例输出
8
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
int main()
{
int value[1001],volumn[1001];//value、volumn分别保存珠宝的价值和体积
long f[5001];//由于背包空间最大值为5000
int n,m;//n代表珠宝数目,m代表背包体积
ifstream cin("aaa.txt");
while(cin>>n>>m&&n!=-1&&m!=-1)
{
memset(value,0,sizeof(value));
memset(volumn,0,sizeof(volumn));
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
cin>>value[i];
}
for(int i=1;i<=n;i++)
{
cin>>volumn[i];
}
for(int i=1;i<=n;i++)
{
for(int j=m;j>=0;j--)
{
if(j>=volumn[i]&&f[j]<f[j-volumn[i]]+value[i])
f[j]=f[j-volumn[i]]+value[i];
}
}
cout<<f[m]<<endl;
}
system("pause");
}