0-1背包问题
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:167 测试通过:151
总提交:167 测试通过:151
描述
有N件物品和一个容量为V的背包。第i件物品的容量是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
输入
输入包括干个测试用例,第一行为一个正整数K(1<=k<=10)表示用例个数,每个用例占三行,第一行为N和V,表示表示物品数量及背包容量,第二行为各物品的容量,第三行为各物品的价值。
输出
每个用例,用一行输出可装入的总大价值。
样例输入
2
5 10
1 1 1 1 1
5 8 6 4 5
4 20
8 7 6 4
14 15 20 9
5 10
1 1 1 1 1
5 8 6 4 5
4 20
8 7 6 4
14 15 20 9
样例输出
28
44
44
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int t;
int dp[100];
cin>>t;
while(t--)
{
memset(dp,0,sizeof(dp));
int N,V;///N表示物品数量,V表示背包容量
int a[100],b[100];///a数组表示各物品的容量,b数组表示各物品的价值
cin>>N>>V;
for(int i=0;i<N;i++)
cin>>a[i];
for(int i=0;i<N;i++)
cin>>b[i];
for(int i=0;i<N;i++)
for(int j=V;j>=a[i];j--)
dp[j]=max(dp[j],dp[j-a[i]]+b[i]);
printf("%d\n",dp[V]);
}
return 0;
}