hdu 4501 三重背包 易错点
2015-12-11 15:41
375 查看
一个小细节上弄错,调试了很久
错误的dp
正确代码
错误的dp
for(i = 0; i < n; ++i) { for(j = v1; j >= 0; --j) { for(t = v2; t >= 0; --t) { for(l = k; l >= 0; --l) { if(j >= a[i]) dp[j][t][l] = max(dp[j][t][l], dp[j-a[i]][t][l]+val[i]); if(t >= b[i]) dp[j][t][l] = max(dp[j][t][l], dp[j][t-b[i]][l]+val[i]); if(l > 0) dp[j][t][l] = max(dp[j][t][l], dp[j][t][l-1]+val[i]); } } } }这种方法会导致一件物品被重复计算
正确代码
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define MS(x,y) memset(x,y,sizeof(x)) #define pi acos(-1.0) using namespace std; void fre(){freopen("t.txt","r",stdin);} typedef long long LL; typedef unsigned long long ULL; const int maxn = 1000005; const int inf = (1<<63)-1; const double eps = 1e-8; int dp[101][101][6],a[101],b[101],val[101]; int main() { fre(); int i,j,t,l,n,v1,v2,k; while(~scanf("%d%d%d%d",&n,&v1,&v2,&k)) { MS(dp,0); for(i = 0; i < n; ++i) { scanf("%d%d%d",&a[i],&b[i],&val[i]); } for(i = 0; i < n; ++i) { for(j = v1; j >= 0; --j) { for(t = v2; t >= 0; --t) { for(l = k; l >= 0; --l) { int temp = 0; if(j >= a[i]) temp = max(temp, dp[j-a[i]][t][l]+val[i]); if(t >= b[i]) temp = max(temp, dp[j][t-b[i]][l]+val[i]); if(l > 0) temp = max(temp, dp[j][t][l-1]+val[i]); dp[j][t][l] = max(dp[j][t][l],temp); } } } } printf("%d\n",dp[v1][v2][k]); } return 0; }
相关文章推荐
- MySQL集群简介与配置详解
- Java中常用的String的工具类
- Material Design学习
- CLION + VIM + CMAKE
- SQL查询语句
- java,break与continue总结
- (学习)C Primer Plus(3)——字符串和格式化输入/输出
- Stackoverflow Error
- Xcode高级调试技巧6
- input file按钮样式修改
- Firefox访问https出现 ssl_error_weak_server_ephemeral_dh_key错误
- ThinkPHP3.2.3完整版中对Auth.class.php的使用
- SQL基础语句
- 织梦dede后台限制简略标题字数的修改
- Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
- Bonfire: Where do I belong
- CentOS 7自定义开机启动系统服务
- Android 自定义标题栏Title Bar
- Git 分支 - 分支的新建与合并
- 剑指offer系列之三十一:把数组排成最小的数