大致题意:有一个人,他有v大小的背包,有n个物品,每个物品有其价值和体积,求物体最大价值且其总体积小于等于背包
输入数据有多组,对于每组数据第一行输入n,m,k,s(0 < n,m,k,s < 100)四个正整数。分别表示还需的经验值,保留的忍耐度,怪的种数和最多的杀怪数。接下来输入k行数据。每行数据输入两个正整数a,b(0 < a,b < 20);分别表示杀掉一只这种怪xhd会得到的经验值和会减掉的忍耐度。(每种怪都有无数个)
输出升完这级还能保留的最大忍耐度,如果无法升完这级输出-1。
测试案例:
input:
1
5 10(n,v)
1 2 3 4 5
5 4 3 2 1
output:
14
解题思路:这题是0-1背包
代码:
代码1:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1010;
int v[maxn],c[maxn],F[maxn][maxn];
int main()
{
int T,i,j,n,V,volume;
scanf("%d",&T);
while (T--)
{
memset(F,0,sizeof (F));
scanf("%d%d",&n,&V);
for (i=1;i<=n;i++)
scanf("%d",&v[i]);
for (i=1;i<=n;i++)
scanf("%d",&c[i]);
for (i=1;i<=n;i++)
{
for (j=0;j<=V;j++)
{
if (j>=c[i])
F[i][j]=max(F[i-1][j],F[i-1][j-c[i]]+v[i]);
else
F[i][j]=F[i-1][j];
}
}
cout<<F[n][V]<<endl;
}
return 0;
}
代码2:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1010;
int v[maxn],c[maxn],F[maxn];
int main()
{
int T,i,j,n,V,volume;
scanf("%d",&T);
while (T--)
{
memset(F,0,sizeof (F));
scanf("%d%d",&n,&V);
for (i=1;i<=n;i++)
scanf("%d",&v[i]);
for (i=1;i<=n;i++)
scanf("%d",&c[i]);
for (i=1;i<=n;i++)
{
for (j=V;j>=0;j--)
{
if (j>=c[i])
F[j]=max(F[j],F[j-c[i]]+v[i]);
}
}
cout<<F[V]<<endl;
}
return 0;
}