时限:1000ms 内存限制:10000K 总时限:3000ms
描述
需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
输入
多个测例,每个测例的输入占三行。第一行两个整数:n(n<=10)和c,第二行n个整数分别是w1到wn,第三行n个整数分别是p1到pn。 n 和 c 都等于零标志输入结束。
输出
每个测例的输出占一行,输出一个整数,即最佳装载的总价值。
输入样例
1 2 1 1 2 3 2 2 3 4 0 0
输出样例
1 4
二维DP解法:
/* * @author Panoss */#include#include #include #include #include #include #include #include #include #include using namespace std;#define DBG 1#define fori(i,a,b) for(int i = (a); i < (b); i++)#define forie(i,a,b) for(int i = (a); i <= (b); i++)#define ford(i,a,b) for(int i = (a); i > (b); i--)#define forde(i,a,b) for(int i = (a); i >= (b); i--)#define forls(i,a,b,n) for(int i = (a); i != (b); i = n[i])#define mset(a,v) memset(a, v, sizeof(a))#define mcpy(a,b) memcpy(a, b, sizeof(a))#define dout DBG && cerr << __LINE__ << " >>| "#define checkv(x) dout << #x"=" << (x) << " | "<
> x#define MIN_LD -2147483648#define MAX_LD 2147483647#define MIN_LLD -9223372036854775808#define MAX_LLD 9223372036854775807#define MAX_INF 18446744073709551615inline int reint() { int d; scanf("%d",&d); return d; }inline long relong() { long l; scanf("%ld",&l); return l; }inline char rechar() { scanf(" "); return getchar(); }inline double redouble() { double d; scanf("%lf", &d); return d; }inline string restring() { string s; cin>>s; return s; }const int N = 1024;int w[N],p[N]; int f[N][N];/* f[i][j]代表前i件物品容量为j的最大值状态转移方程f[i][j] = max(f[i-1][j-w[i]]+p[i],f[i-1][j])*/void DP(int n,int c) ///从n件物品选出物品,使容量最大值,不超过c{ mset(f,0); forie(i,1,n) ///从第一件物品开始,自低向上 { forie(j,0,c) ///枚举背包容量,自低向上 { if(j>=w[i]) { f[i][j] = max(f[i-1][j-w[i]]+p[i],f[i-1][j]); } else f[i][j] = f[i-1][j]; } }}int main(){ int n,c; while(cin>>n>>c,(n+c)) { forie(i,1,n) cin>>w[i]; forie(i,1,n) cin>>p[i]; DP(n,c); cout< <
一维DP解法:
const int N = 1024;int w[N],p[N];int d[N];/// d[i]表示体积为i的最大值/// 状态转移方程d[i] = max(d[i-w[i]]+p[i],d[i])void DP(int n,int c) ///从n件物品选出物品,使容量最大值,不超过c{ mset(d,0); forie(i,1,n) ///从第一件物品开始,自低向上 { forde(j,c,w[i]) ///枚举背包容量,注意方向,从c至w[i] { if(j>=w[i]) { d[j] = max(d[j-w[i]]+p[i],d[j]); } } }}int main(){ int n,c; while(cin>>n>>c,(n+c)) { forie(i,1,n) cin>>w[i]; forie(i,1,n) cin>>p[i]; DP(n,c); cout<<