zoukankan      html  css  js  c++  java
  • wenbao与背包

     1 f[i][v]=( f[i-1][v] + f[i-1][v-c[i]]+w[i] );
     2 
     3 f[v]=max( f[v] , f[v-c[i]]+w[i] );
     4 
     5 f[i][v]=max( f[i-1][v], f[i-1][v-c[i]*k]+w[i]*k);
     6 0<=k>=v/c[i];
     7 
     8 f[i][v]=max( f[i-1][v] ,  f[i][v-c[i]]+w[i] ); 
     9 
    10 for(int  v=0;v<V;v++) 
    11 
    12 
    13 
    14 
    15 
    16 
    17 for(int i=0;i<N;i++)
    18  for( int v=0;v<V;v++ )
    19  f[i][v]=max(f[i-1][v],f[i-1][v-c[i]]+w[i]);
    20 
    21 
    22 for(int  i=0;i<N;i++)
    23 for( int v=V;v>=0;v--)
    24 f[v]=max(f[v],f[V-c[i]]+w[i]);
    25 
    26 for(int i=0;i<N;i++)
    27 for(int v=0;v<V;v++)
    28     f[i][v]=max(f[i-1][v],f[i][V-c[i]]+w[i]);
    29 
    30 for(int i=0;i<N;i++)
    31 for(int v=0;v<V;v++)
    32 f[v]=max(f[v],f[V-c[i]]+w[i]);
    33 
    34 
    35 
    36 
    37 
    38 //01背包
    39 forint   i = 1;i< = n; i++40 for(int  j  = V; j >= a[i] ; j--)
    41 f[j] = max ( f[j], f[ j - a[i] ] + w[i] )
    42 
    43 
    44 //完全背包
    45 for( int i = 1;i <= n; i++)
    46 for( int j = a[i];j <= V; j++)
    47 f[j] = max( f[j] , f[ j - a[i] ] + w[i] );

    -------------------------------------------------------------------

    背包记录路径

    https://www.patest.cn/contests/gplt/L3-001

    找零钱

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <string.h>
     4 using namespace std;
     5 
     6 const int maxn = 1e4+10;
     7 int n, m, a[maxn], b[maxn], cnt[maxn], pr[maxn];
     8 
     9 void pri(int sum){
    10     if(sum != cnt[sum]){
    11         pri(sum - cnt[sum]);
    12         printf(" %d", cnt[sum]);
    13     }else{
    14         printf("%d", cnt[sum]);
    15     }
    16 }
    17 
    18 int main(){
    19     scanf("%d%d", &n, &m);
    20     for(int i = 1; i <= n; ++i){
    21         scanf("%d", &a[i]);
    22     }
    23     memset(b, -0x3f3f, sizeof(b));
    24     sort(a+1, a+n+1);
    25     b[0] = 0;
    26     for(int i = 1; i <= n; ++i){
    27         for(int j = m; j >= a[i]; --j){
    28             if(b[j] <= b[j-a[i]]+1) b[j] = b[j-a[i]]+1, cnt[j] = a[i];
    29         }
    30     }
    31     if(b[m] > 0){
    32         pri(m);
    33         printf("
    ");
    34     }else{
    35         printf("No Solution
    ");
    36     }
    37     return 0;
    38 }

    -------------------------------------------------------------------

    多重背包记录路径

    http://poj.org/problem?id=1787

     1 #include <iostream>
     2 #include <string.h>
     3 #include <stdio.h>
     4 using namespace std;
     5 
     6 const int maxn = 10009;
     7 int b[4], e[4], d[maxn], c[maxn], us[maxn];
     8 
     9 int main() {
    10     int p, a[] = {25, 10, 5, 1};
    11     while(~scanf("%d%d%d%d%d", &p, &b[3], &b[2], &b[1], &b[0])) {
    12         if(p == 0 && b[3] == 0 && b[2] == 0 && b[1] == 0 && b[0] == 0) break;
    13         memset(d, -1, sizeof(d));
    14         d[0] = 0;
    15         for(int i = 3; i >= 0; --i) {
    16             memset(us, 0, sizeof(us));
    17             for(int j = a[i]; j <= p; ++j) {
    18                 if(d[j-a[i]] != -1 && d[j] <= d[j-a[i]]+1 && us[j-a[i]] < b[i]) {
    19                     d[j] = d[j-a[i]]+1;
    20                     us[j] = us[j-a[i]] + 1;
    21                     c[j] = i;
    22                 }
    23             }
    24         }
    25         //cout<<d[p]<<endl;
    26         if(d[p] > 0) {
    27             e[0] = e[1] = e[2] = e[3] = 0;
    28             while(d[p]) {
    29                 e[c[p]]++;
    30                 p -= a[c[p]];
    31             }
    32             printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.
    ", e[3], e[2], e[1], e[0]);
    33 
    34         } else {
    35             printf("Charlie cannot buy coffee.
    ");
    36         }
    37     }
    38     return 0;
    39 }

    -------------------------------------------------------------------

    01背包记录路径

    http://codeforces.com/contest/864/problem/E

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 const int maxn = 111;
     6 int a[maxn], b[maxn], c[maxn], id[maxn], d[111][2009], pre[111][2009], num = 0;
     7 
     8 void pri(int xx, int mx){
     9     if(xx == 0){
    10         printf("%d
    ", num);
    11         return ;
    12     }
    13     if(pre[xx][mx] != mx) num ++;
    14     pri(xx-1, pre[xx][mx]);
    15     if(pre[xx][mx] != mx){
    16         printf("%d ", id[xx]);
    17     }
    18 }
    19 
    20 int main(){
    21     int n, mx = 0, ma = 0, xx;
    22     scanf("%d", &n);
    23     for(int i = 1; i <= n; ++i){
    24         scanf("%d%d%d", &a[i], &b[i], &c[i]);
    25         id[i] = i;
    26     }
    27     sort(id+1, id+n+1, [](int x, int y){
    28         return b[x] < b[y];
    29     });
    30     int sum = 0;
    31     for(int i = 1; i <= n; ++i){
    32         int x = id[i];
    33         for(int k = 0; k < 2009; ++k) d[i][k] = d[i-1][k], pre[i][k] = k;
    34         for(int j = b[x]; j > a[x]; --j){
    35             if(d[i-1][j-a[x]]+c[x] > d[i][j]){
    36                 d[i][j] = d[i-1][j-a[x]] + c[x];
    37                 pre[i][j] = j-a[x];
    38             }
    39         }
    40     }
    41     for(int i = 0; i < 2009; ++i){
    42         if(d[n][i] > ma) ma = d[n][i], mx = i;
    43     }
    44     printf("%d
    ", ma);
    45     pri(n, mx);
    46     printf("
    ");
    47     return 0;
    48 }

     大牛代码

     1 #include <vector>
     2 #include <iostream>
     3 #include <algorithm>
     4 using namespace std;
     5 int n, t[109], d[109], p[109], id[109], dp[109][2009];
     6 int main() {
     7     cin >> n;
     8     for (int i = 0; i < n; i++) cin >> t[i] >> d[i] >> p[i], id[i] = i + 1;
     9     for (int i = 0; i < n; i++) {
    10         for (int j = i + 1; j < n; j++) {
    11             if (d[i] > d[j]) {
    12                 swap(t[i], t[j]);
    13                 swap(d[i], d[j]);
    14                 swap(p[i], p[j]);
    15                 swap(id[i], id[j]);
    16             }
    17         }
    18     }
    19     for (int i = 0; i < n; i++) {
    20         for (int j = 0; j < d[i]; j++) {
    21             dp[i + 1][j] = dp[i][j];
    22             if (j >= t[i]) dp[i + 1][j] = max(dp[i + 1][j], dp[i][j - t[i]] + p[i]);
    23         }
    24     }
    25     int pos = max_element(dp[n], dp[n] + d[n - 1]) - dp[n];
    26     cout << dp[n][pos] << endl;
    27     vector<int> v;
    28     for (int i = n - 1; i >= 0; i--) {
    29         if (dp[i][pos] != dp[i + 1][pos]) v.push_back(id[i]), pos -= t[i];
    30     }
    31     reverse(v.begin(), v.end());
    32     cout << v.size() << endl;
    33     for (int i = 0; i < v.size(); i++) cout << v[i] << ' ';
    34     return 0;
    35 }

    ------------------------------------------------------------------------

    --------------------------------------------------------------------------

    只有不断学习才能进步!

  • 相关阅读:
    foundation框架—结构体
    OC语言BLOCK和协议
    OC语言description方法和sel
    OC语言类的本质和分类
    清除浮动的常用方法
    php动态读取数据清除最右边距
    css背景图片定位练习(二): background-position的百分比
    css背景图片定位练习(一)
    行高不设单位的好处 line-height:1.8
    background:transparent的作用
  • 原文地址:https://www.cnblogs.com/wenbao/p/5790869.html
Copyright © 2011-2022 走看看