背包基础题 【 题集 】 更新ing ......

来源:互联网 发布:linux sh 编辑:程序博客网 时间:2024/04/29 06:29

    今天重新回去做了一下背包,发现自己,根本不会了已经、、、、

    这边的题目,都很基础!!!

    1、完全背包  HDU 1114  链接:acm.hdu.edu.cn/showproblem.php?pid=1114

    这个就是简单的完全背包,并且是判断恰好装满的那种

   

//HDU Piggy-Bank 完全背包#include <stdio.h>const int N = 550;int c[N];int w[N];int dp[10010];const int INF = 10000000;  //判断是否恰好装满, 这题就这里了int min(int x, int y){return x < y ? x : y ;}int main(){int n, m;int i, j;int a, b;int cc, ww;while(~scanf("%d",&n)){while(n --){            scanf("%d%d", &cc, &ww);            scanf("%d", &m);            for(i = 0; i <= ww - cc; i ++)            dp[i] = INF;            for(i = 0; i < m; i ++)            scanf("%d%d",&c[i], &w[i]);dp[0] = 0;            for(i = 0;i < m; i ++)            {            for(j = w[i]; j <= ww - cc; j ++)            dp[j] = min(dp[j - w[i]] + c[i], dp[j]);            }            if(dp[ww - cc] == INF)   // 这题学会了这个            printf("This is impossible.\n");          else          printf("The minimum amount of money in the piggy-bank is %d.\n",dp[ww - cc]);  }}return 0;}

    2、分组背包  HDU 1712  ACboy needs your help  链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712 

    就是物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

    突然发现一个挺好的网页链接,也是关于背包九讲的,可以试试、、 http://love-oriented.com/pack/P06.html  只要改一下P06 中的最后一位数字,就可以看各样的背包解析了。

   

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int dp[110];int tt[110][110];int main(){        int n, m;while(~scanf("%d%d",&n,&m)){if(n == 0 && m == 0)    break;memset(dp, 0, sizeof(dp));        for(int i = 1; i <= n; i ++){for(int j = 1; j <= m; j ++)scanf("%d",&tt[i][j]);}for(int i = 1; i <= n; i ++){for(int j = m; j>= 0; j --){for(int k = 1; k <= j; k ++)    dp[j] = max(dp[j], dp[j - k] + tt[i][k]);}}printf("%d\n",dp[m]);}return 0;}
做完可以看一看HDU 3033

    3、 01背包  HDU 2602  Bone Collector    http://acm.hdu.edu.cn/showproblem.php?pid=2602

   

#include <stdio.h>#include <string.h>#include <math.h>#include <queue>#include <algorithm>using namespace std;int t;int n, m;int dp[1010];int v[1010];int w[1010];int main(){    while(~scanf("%d",&t))    {        while(t --)        {            memset(dp, 0, sizeof(dp));            memset(v, 0, sizeof(v));            memset(w, 0, sizeof(w));            scanf("%d%d",&n, &m);            for(int i = 0; i < n; i ++)                scanf("%d",&w[i]);            for(int i = 0; i < n; i ++)                scanf("%d",&v[i]);            for(int i = 0; i < n; i ++)            {                for(int j = m; j - v[i] >= 0; j --)                {                    dp[j] = max(dp[j], dp[j - v[i]] + w[i]);                }            }            printf("%d\n",dp[m]);        }    }    return 0;}


0 0