nyoj 860 (01背包 变形)

来源:互联网 发布:淘宝劲舞团g币怎么刷的 编辑:程序博客网 时间:2024/06/06 13:10

点击打开链接http://acm.nyist.net/JudgeOnline/problem.php?pid=860

#include <stdio.h>#include <memory.h>#include <algorithm>#define Inf 1001000000 using namespace std;  const int M=110; // 因为同样价值,重量越小,那么最后能装的价值就可能越大long dp[M][M*M]; // 对价值进行dp  dp[i][j] 选前i件物品价值为j的最小重量 int main()  // 要求重量在 W 内的最大价值 {//则答案为 dp[n][j]中的最大j && dp[n][j]<=W  long W,w[M];long i,j,k,n,v[M],sum;while(~scanf("%d%ld",&n,&W)){sum=0;for(i=1;i<=n;i++){scanf("%ld%d",&w[i],&v[i]);sum+=v[i]; // 价值上限 } for(i=0;i<=n;i++) // 初始化 {for(j=0;j<=sum;j++){dp[i][j]=Inf;}}for(i=0;i<=n;i++){dp[i][0]=0; // 什么都不拿的 重量为0 }for(i=1;i<=n;i++){for(j=0;j<=M*n;j++){if(j>=v[i])dp[i][j]=min(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);elsedp[i][j]=dp[i-1][j];}}for(j=sum;j>=0;j--){if(dp[n][j]<=W){break;}}printf("%ld\n",j);}return 0;}


0 0
原创粉丝点击