您的位置:首页 > 其它

hdu--2159--二维费用背包<一维错误解法>

2014-08-04 21:06 225 查看
这题 还好 我A了之后 习惯性地去看了下 discuss 然后发现 基本上所有人的解法都在说 二维费用完全背包。。。

还好 看到一个人 是和我一样的用 一维 完全背包 加一个计数的cnt数组去解决的。。。

还好 在那边看到了一个人的质疑 并给出了一组数据 果然 一维的不能通过=-=那就只能 去学下 二维费用背包了...擦 这名字好长啊

因为 当时 我背包九讲只学到了01 完全 多重 后面就没学了 。。。

二维费用背包要是一般的话 很简单的 就是多了一层for而已 而且假如这个数组是dp[ i ] [ u[i] ] [ v[i] ]那么u[i] , v[i]的遍历前后顺序对面最终结果是没有影响 只要你自己开的数组与这个前后遍历顺序相对应

      touch me

我将 错误的代码 也放上来好了。。。 虽然A了。只能怪 测试数据太弱了 同时 附上 测试数据

// 二维 费用 背包
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int size = 110;
int val[size];
int weight[size];
int dp[size][size];//一维 忍耐度  二维 杀怪数

int main()
{
int n , m , k , s , ans;
bool flag;
while( cin >> n >> m >> k >> s )
{
flag = false;
for( int i = 1 ; i<=k ; i++ )
{
cin >> val[i] >> weight[i];
}
memset( dp , 0 , sizeof(dp) );
for( int i = 1 ; i<=k ; i++ )
{
for( int j = weight[i] ; j<=m ; j++ )
{
for( int p =  1 ; p<=s ; p++ )
{
dp[j][p] = max( dp[j][p] , dp[ j-weight[i] ][ p-1 ] + val[i] );
}
}
}
if( dp[m][s] <n )
cout << -1 << endl;
else
{
for( int i = 1 ; i<=m ; i++ )
{
for( int j = 1 ; j<=s ; j++ )
{
if( dp[i][j]>=n )
{
ans = m-i;
flag = true;
break;
}
}
if( flag )
break;
}
cout << ans << endl;
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: