codeforces 366C C. Dima and Salad(dp)
2015-10-04 09:41
381 查看
题目链接:
codeforces 366C题目大意:
给出n个物品,有两个属性,问最后第一个属性的总和是第二个属性的k倍的时候,第一个属性最大是多少。题目分析:
我们将物品做一个变形,重量为a[i]-b[i]*k,收益是a,那么我们只需要对重量为正的做一遍背包,对质量为负的取绝对值做一遍背包,然后重量相等的背包的收益之和就是当前重量下的最大收益.AC代码:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define MAX 107 using namespace std; int dp[MAX*MAX],dd[MAX*MAX]; int n,k,a[MAX],b[MAX],c[MAX]; int main ( ) { while ( ~scanf ( "%d%d" , &n , &k ) ) { for ( int i = 0 ; i < n ; i++ ) scanf ( "%d" , &a[i] ); for ( int i = 0 ; i < n ; i++ ) scanf ( "%d" , &b[i] ); for ( int i = 0 ; i < n ; i++ ) c[i] = a[i]-b[i]*k; memset ( dp , -0x3f , sizeof ( dp ) ); memset ( dd , -0x3f , sizeof ( dd ) ); dp[0] = dd[0] = 0; for ( int i = 0 ; i < n ; i++ ) if ( c[i] >= 0 ) for ( int j = 10000 ; j >= c[i] ; j-- ) dp[j] = max ( dp[j-c[i]]+a[i] , dp[j] ); for ( int i = 0 ; i < n ; i++ ) if ( c[i] < 0 ) { c[i] = -c[i]; for ( int j = 10000 ; j >= c[i] ; j-- ) dd[j] = max ( dd[j-c[i]]+a[i] , dd[j] ); } int ans = -1; for ( int i = 0; i <= 10000 ; i++ ) { if ( dd[i] == 0 && dp[i] == 0 ) continue; ans = max ( ans , dp[i]+dd[i] ); } printf ( "%d\n" , ans ); } }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- Codeforces Round #197 (Div. 2)
- Codeforces Round #198 (Div. 1)
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces 407C Codeforces Round #239 (Div. 1)C
- 01背包问题