【背包总结I】

来源:互联网 发布:mac上面怎么装office 编辑:程序博客网 时间:2024/05/22 01:25

1. 01背包

     1.1求 《= tot 的最大值

#include <cstring>#include <cmath>#include <queue>#include <stack>#include <list>#include <map>#include <set>#include <string>#include <cstdlib>#include <cstdio>#include <algorithm>using namespace std;    const int N = 10, W = 1000;int value[N], weight[N];int dp[W + 1];int n,tot;int main(){scanf("%d%d",&n,&tot);for(int i=0;i<n;i++){scanf("%d%d",&value[i],&weight[i]);}    memset(dp,0,sizeof(dp));for(int i=0;i<n;i++){for(int j=tot;j>=weight[i];j--){dp[j] = max(dp[j],dp[j-weight[i]] + value[i]);}}printf("%d\n",dp[tot]);    return 0;}


      1.2 求 == tot ? 

#include <iostream>#include <cstring>#include <cmath>#include <queue>#include <stack>#include <list>#include <map>#include <set>#include <string>#include <cstdlib>#include <cstdio>#include <algorithm>using namespace std;    const int N = 10, W = 1000;int value[N], weight[N];int dp[W + 1];int n,tot;int main(){scanf("%d%d",&n,&tot);for(int i=0;i<n;i++){scanf("%d%d",&value[i],&weight[i]);}    memset(dp,-1,sizeof(dp));dp[0] = 0;for(int i=0;i<n;i++){for(int j=tot;j>=weight[i];j--){if(dp[j-weight[i]] >= 0)dp[j] = max(dp[j],dp[j-weight[i]] + value[i]);}}printf("%d\n",dp[tot]);    return 0;}

       1.3 输出一种方案

输出代码的图解



#include <iostream>#include <cstring>#include <cmath>#include <queue>#include <stack>#include <list>#include <map>#include <set>#include <string>#include <cstdlib>#include <cstdio>#include <algorithm>using namespace std;    const int N = 10, W = 1000;int value[N], weight[N];int dp[W + 1];bool has[W + 1][N];int n,tot;int main(){scanf("%d%d",&n,&tot);for(int i=0;i<n;i++){scanf("%d%d",&value[i],&weight[i]);}    memset(dp,0,sizeof(dp));memset(has,0,sizeof(has));//dp[0] = 0;for(int i=0;i<n;i++){for(int j=tot;j>=weight[i];j--){/*if(dp[j-weight[i]] >= 0)dp[j] = max(dp[j],dp[j-weight[i]] + value[i]); */if(dp[j] < dp[j-weight[i]] + value[i]){dp[j] =  dp[j-weight[i]] + value[i];has[j][i] = true;}}}printf("%d\n",dp[tot]);for(int i=n-1;i>=0;i--){if(has[tot][i]){cout << value[i] << " " << weight[i] << endl;tot -= weight[i];}}    return 0;}





0 0