NYOJ 题目860 又见01背包 (特别版01背包)
来源:互联网 发布:巨灵数据 金融界 编辑:程序博客网 时间:2024/06/06 03:59
又见01背包
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
- 有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W的物品,求所有挑选方案中物品价值总和的最大值。1 <= n <=1001 <= wi <= 10^71 <= vi <= 1001 <= W <= 10^9
- 输入
- 多组测试数据。
每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的wi 和 vi。 - 输出
- 满足题意的最大价值,每组测试数据占一行。
- 样例输入
4 52 31 23 42 2
- 样例输出
7
思路:这个01背包不是通常的01背包,因为背包容量太大,数组开不了那么大,于是就采用了换位思考(形容的不贴切)。开一个数组dp[i]一些物品价值为i时的最小质量。这样的话,最后求出质量小于等于背包总容量时的价值就是能放的最大价值。
注意:数组要初始化为无穷大,因为是求最小值,当然dp[0]还是要初始化为0的。
dp状态方程:dp[j]=min(dp[j],dp[j-weight[i]]+value[i]) j>=weight[i]。
代码如下:
#include<iostream>#include<cstring>#include<cmath>#include<cstdio>#define MAXN 0x3f3f3f3fusing namespace std;int dp[10005];int value[105];int weight[105];int main(){int n,w,i,j,sum; while(scanf("%d%d",&n,&w)==2){ sum=0; for(i=1;i<=n;i++){cin>>weight[i]>>value[i];sum+=value[i];}for(i=1;i<=sum;i++)dp[i]=MAXN;dp[0]=0;for(i=1;i<=n;i++){for(j=sum;j>=value[i];j--){dp[j]=min(dp[j],dp[j-value[i]]+weight[i]);}}for(i=sum;i>=0;i--){if(dp[i]<=w){cout<<i<<endl;break;}} }return 0;}
0 0
- NYOJ 题目860 又见01背包 (特别版01背包)
- NYOJ 题目860 又见01背包
- NYOJ 题目860 又见01背包(01背包变形)
- nyoj 860 又见01背包(01 背包)
- nyoj 860又见01背包(01背包)
- nyoj 又见01背包
- nyoj 又见01背包
- NYOJ又见01背包
- NYOJ 860 又见01背包
- 又见01背包(nyoj 860)
- NYOJ 860 又见01背包
- NYOJ 860 又见01背包
- NYOJ 860 又见01背包
- NYOJ 860 又见01背包
- NYOJ 860 又见01背包
- nyoj 860又见01背包
- NYOJ 860 又见01背包
- NYOJ 860 又见01背包
- cocoPods和pch文件的配合使用
- adb 端口被占
- Java String 字符串
- java调用python
- 服务器配置官方相关文档
- NYOJ 题目860 又见01背包 (特别版01背包)
- Cannot change version of project facet Dynamic web module to 3.0 解决方案
- join,yield等关键字的使用
- Python开发环境安装和配置
- nodejs学习
- 总结
- 快速幂算法及矩阵快速幂
- Java与数据库数据类型对应表
- POJ 3164 Command Network 最小树形图