来源hdu2602
问题描述
许多年前,在泰迪的家乡,有一个人被称为“骨头收藏家”。这个男人喜欢收集各种各样的骨头,比如狗狗,牛,还有他去了坟墓......
骨头收藏家有一个大容量的V袋,沿着他的收集之旅有很多骨头,显然,不同的骨骼具有不同的值和不同的体积,现在根据他的行程给出每个骨骼的值,你能计算出骨骼采集器可以得到的总值的最大值吗?
输入
第一行包含整数T,个案数。
接下来是T个案例,每个案例有三行,第一行包含两个整数N,V,(N <= 1000,V <= 1000)表示骨骼的数量和他的包的体积。第二行包含表示每个骨骼值的N个整数。第三行包含表示每个骨骼体积的N个整数。
输出
每行一个整数表示总值的最大值(此数字将小于2 31)。
样本输入
1
5 10
1 2 3 4 5
5 4 3 2 1
样本输出
14
最基础01背包,判断第i件要不要放进去,状态转移方程dp[i][V]=max{dp[i-1][V],dp[i-1][V-v[i]]+w[i]}
“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”;如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f [i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <iomanip>
#include<cmath>
#include<float.h>
#include<string.h>
#include<algorithm>
#define sf scanf
#define pf printf
#define scf(x) scanf("%d",&x)
#define scff(x,y) scanf("%d%d",&x,&y)
#define prf(x) printf("%d
",x)
#define mm(x,b) memset((x),(b),sizeof(x))
#include<vector>
#include<queue>
#include<map>
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
typedef long long ll;
const ll mod=1e9+100;
const double eps=1e-8;
using namespace std;
const double pi=acos(-1.0);
const int N=1005;
int dp[N][N];
int w[N],v[N];
int main()
{
int re,V,n;
scf(re);
v[0]=0;w[0]=0;
while(re--)
{
mm(dp,INT_MIN);
scff(n,V);
rep(i,1,n+1)
scf(w[i]);
rep(i,1,n+1)
scf(v[i]);
rep(i,1,n+1)//第i件物品
rep(j,0,V)//空间为j的时候
{
if(v[i]<=j)
dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);
else
dp[i][j]=dp[i-1][j];
}
prf(dp[n][V]);
}
return 0;
}
一维
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <iomanip>
#include<cmath>
#include<float.h>
#include<string.h>
#include<algorithm>
#define sf scanf
#define pf printf
#define scf(x) scanf("%d",&x)
#define scff(x,y) scanf("%d%d",&x,&y)
#define prf(x) printf("%d
",x)
#define mm(x,b) memset((x),(b),sizeof(x))
#include<vector>
#include<queue>
#include<map>
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
typedef long long ll;
const ll mod=1e9+100;
const double eps=1e-8;
using namespace std;
const double pi=acos(-1.0);
const int N=1e3+5;
int dp[N];
int w[N],v[N];
int main()
{
int re,V,n;
scf(re);
while(re--)
{
mm(dp,0);
scff(n,V);
rep(i,1,n+1)
scf(w[i]);
rep(i,1,n+1)
scf(v[i]);
rep(i,1,n+1)
{
per(j,V,v[i])
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
prf(dp[V]);
}
return 0;
}