• 01背包带路径


    输出背包中选中的物品

    方法一,用path[i][j] 到第i个物品体积为j时的状态是否由放入第i个物品转换而来

     1 #include<iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 int dp[10005];
     6 bool path[105][10005];
     7 int v[1005],w[10005];
     8 
     9 int main(){
    10     int N,V;
    11     while(cin>>N>>V){
    12         memset(path,0,sizeof(path));
    13         memset(dp,0,sizeof(dp));
    14         for(int i=1;i<=N;i++)cin>>v[i]>>w[i];
    15         for(int i=N;i>=1;i--){
    16             for(int j=V;j>=v[i];j--){
    17                 if(dp[j] < dp[j-v[i]] + w[i]){
    18                     dp[j] = dp[j-v[i]] + w[i];
    19                     path[i][j] = 1;
    20                 }
    21             }
    22         }
    23         cout<<dp[V]<<endl;
    24         for(int i=1,j=V;i<=N&&j>0;i++){
    25             if(path[i][j]) {
    26                 printf("%d ", i);
    27                 j -= v[i];
    28             }
    29         }
    30         cout<<endl;
    31     }
    32     return 0;
    33 }

    方法二,定义结构体,对每次加入物品时更新path

     1 #include<iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 #define MAXN 100005
     6 
     7 int n,V;
     8 struct Node{
     9     int w;
    10     string path;
    11     void init(){
    12         string str(n,'0');
    13         w = 0;
    14         path = str;
    15     }
    16 }dp[MAXN];
    17 
    18 int v[MAXN];
    19 int w[MAXN];
    20 
    21 int main(){
    22     while(cin>>n>>V){
    23         for(int i=1;i<=n;i++){
    24             cin>>v[i]>>w[i];
    25         }
    26         for(int i=0;i<=V;i++){
    27             dp[i].init();
    28         }
    29         for(int i=1;i<=n;i++){
    30             for(int j=V;j>=v[i];j--){
    31                 if(dp[j].w <dp[j-v[i]].w + w[i]){
    32                     dp[j].w = dp[j-v[i]].w + w[i];
    33                     dp[j].path = dp[j-v[i]].path;
    34                     dp[j].path[i-1]='1';
    35                 }
    36             }
    37         }
    38         cout<<dp[V].w<<endl;
    39         cout<<dp[V].path<<endl;
    40     }
    41     return 0;
    42 }
  • 相关阅读:
    脱壳->模拟追踪脱壳法原理
    脱壳->内存断点法脱壳
    奇技淫巧技术-注册表的操作
    LoardPe与Import REC X64dbg脚本 脱壳 Upx
    VS快捷键一览表.常用快捷键整理.
    VS2019库头文件的使用
    PowerShell第一讲,别名,变量,命令。
    Debug技巧-启动调试附加原理
    strlen的另一种实现,可以作为ShellCode
    windows-遍历另一进程内存根据进程PID
  • 原文地址:https://www.cnblogs.com/demian/p/11480426.html
Copyright © 2020-2023  润新知