有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
1 d#include<bits/stdc++.h> 2 using namespace std; 3 4 const int N = ???; 5 int V, m; 6 int dp[N]; 7 int w[N], num[N]; 8 9 void mul(int n,int w){ 10 if(n*w >= V){ 11 for(int i=w; i<=V; i++) 12 dp[i] = max(dp[i], dp[i-w]+w); 13 return ; 14 } 15 int k = 1; 16 int nC = n; 17 while(k < nC){//01背包,做简单的优化 18 for(int i=V; i>=k*w; i--) 19 dp[i] = max(dp[i], dp[i-k*w]+k*w); 20 nC -= k; 21 k *= 2; 22 } 23 for(int i=V; i>=nC*w; i--) 24 dp[i] = max(dp[i], dp[i-nC*w]+nC*w); 25 } 26 int main(){ 27 while(scanf("%d %d", &m, &V) && m && V){ 28 for(int i=0; i<=V; ++i) dp[i] = 0; 29 for(int i=0; i<m; ++i) scanf("%d", w+i); 30 for(int i=0; i<m; ++i) scanf("%d", num+i); 31 32 //多重背包 33 for(int i=0; i<m; ++i) 34 mul(num[i], w[i]); 35 36 printf("%d\n",dp[V]); 37 } 38 return 0; 39 }