当年学的第一个背包,拿出来。http://acm.hdu.edu.cn/showproblem.php?pid=2602
经典01背包问题,挺适合学习的。
01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }
f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
Pi表示第i件物品的价值。
决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ?
这里有两种决策方式:
(a)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量位j-w
i
的背包中的价值加上第i个物品的价值v
i;。
(b)如果第i个物品没有装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。
#include <iostream> #include <cstring> #include <cmath> using namespace std; int Max(int a,int b) { if(a>b) { return a; } else { return b; } } int main() { int V; int T; int n; int dp[1004]; int val[1004]; int vom[1004]; cin>>T; while(T--) { cin>>n>>V; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { cin>>val[i]; } for(int j=1;j<=n;j++) { cin>>vom[j]; } for(int i=1;i<=n;i++) { for(int j=V;j>=vom[i];j--) { dp[j]=Max(dp[j],dp[j-vom[i]]+val[i]); } } cout<<dp[V]<<endl; } return 0;