51nod--多重背包

来源:互联网 发布:淘宝闪电退款 编辑:程序博客网 时间:2024/05/23 21:40

原题链接

代码如下:

#include <bits/stdc++.h>using namespace std;int d[50005];int main(){int n, m, w, p, c;scanf( "%d%d", &n, &m);memset( d, 0, sizeof( d));for ( int i = 1; i <= n; i++){     scanf( "%d%d%d", &w, &p, &c);     if ( w * c >= m){          for ( int j = w; j <= m; j++){               d[j] = max( d[j], d[j - w] + p);          }     }     else{         int x = 1;         while ( x < c){              for ( int j = m; j >= x * w; j--){                   d[j] = max( d[j], d[j - x * w] + x * p);             }              c -= x;              x *= 2;        }         for ( int j = m; j >= c * w; j--){              d[j] = max( d[j], d[j - c * w] + c * p);         }     }}printf( "%d\n", d[m]);return 0;}


0 0
原创粉丝点击