DP1

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 const int MAX = 1000;
 7 int N, w[MAX], v[MAX], sum[MAX*MAX],i,num,n,j;
 8 int main()
 9 {
10     while(~scanf("%d%d",&num,&n))
11     {
12         memset(sum, 0, sizeof(sum));
13         for(i=1; i<=n; i++) scanf("%d%d",&w[i], &v[i]);
14         for(i=1; i<=n; i++)
15             for(j=num; j>=w[i]; j--)
16                 sum[j] = max(sum[j-1], sum[j-w[i]] + v[i]);// 包括或不包括第i个物品,比较总价值大小,sum[j]表示体积为j时的最大价值
17         printf("%d\n", sum[num]);
18     }
19     return 0;
20 }

 1 输入文件第一行有两个数,第一个是国王可用用来开采金矿的总人数,第二个是总共发现的金矿数。
 2        输入文件的第2至n+1行每行有两个数,第i行的两个数分别表示第i-1个金矿需要的人数和可以得到的金子数。
 3
 4        输出文件仅一个整数,表示能够得到的最大金子数。
 5
 6        输入样例:
 7        100 5
 8        77 92
 9        22 22
10        29 87
11        50 46
12        99 90
13
14        输出样例:
15        133

杭电2602

 1 #include <iostream>
 2 using namespace std;
 3 struct commodity
 4 {
 5     int value;
 6     int weight;
 7 };
 8 int select[1001][1001];
 9 commodity goods[1001]={{0,0}};
10
11 int max_value(int N, int W,commodity goods[]);
12
13 int main()
14 {
15     int N, W, T, i;
16     cin >> T;
17     while(T--)
18     {
19         cin >> N >> W;
20         for(i = 1; i < N + 1; i++)
21             cin >> goods[i].value;
22         for(i = 1; i < N + 1; i++)
23             cin >> goods[i].weight;
24         cout<<max_value(N, W, goods)<<endl;
25     }
26     return 0;
27 }
28 int max_value(int N, int W,commodity goods[])
29 {
30                                                                                  //首先是定义一个状态
31     for(int i=1;i<=N;++i)
32     {
33         select[i][0] = 0;  //背包容量为0时,最大价值为0
34         for(int w=0;w<=W;++w)
35         {
36             if(goods[i].weight <= w)  //当前物品i的重量小于等于w,进行选择
37             {
38                 if( (goods[i].value + select[i-1][w-goods[i].weight]) > select[i-1][w])                        //状态转移方程
39                     //DP[i][j] Weight不超过j的时候   不选i+1     选i+1
40                     //DP[i+1][j]=max{DP[i][j],DP[i][j-W[i]]+V[i]}
41                     select[i][w] = goods[i].value + select[i-1][w-goods[i].weight];            //描述状态转移的过程
42                 else
43                     select[i][w] = select[i-1][w];
44             }
45             else //当前物品i的重量大于w,不选择
46                 select[i][w] = select[i-1][w];
47         }
48     }
49     return select[N][W];  //最终求得最大值
50 }
51 // 将两处循环中的w改为0,可以对

 1 #include<stdio.h>
 2 #include<string.h>
 3 int max(int x,int y)
 4 {
 5  return x>y?x:y;
 6 }
 7  int N,a[1002],b[1002],c[1002],i,m,n,j;
 8
 9 int main()
10 {
11  scanf("%d",&N);
12  while(N--)
13  {
14    memset(c,0,sizeof(c));
15
16   scanf("%d%d",&n,&m);
17   for(i=1;i<=n;i++) scanf("%d",&a[i]);
18   for(i=1;i<=n;i++) scanf("%d",&b[i]);
19   for(i=1;i<=n;i++)
20    for(j=m;j>=b[i];j--)                    //  c若为二维,会有很大的浪费,可以用一维的,只是 j 的初始值应为最大体积m
21     c[j]=max(c[j],c[j-b[i]]+a[i]);                // 包括或不包括第i个物品,比较总价值大小,c[j]表示体积为j时的最大价值
22    printf("%d\n",c[m]);
23  }
24  return 0;
25 }

一方法不太好,二方法减少二维数组的浪费,同时意思更容易理解

时间: 2024-10-16 08:13:14

DP1的相关文章

【算法系列学习】状压dp [kuangbin带你飞]专题十二 基础DP1 D - Doing Homework

https://vjudge.net/contest/68966#problem/D http://blog.csdn.net/u010489389/article/details/19218795 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<cmath>

【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 G - 免费馅饼

https://vjudge.net/contest/68966#problem/G 正解一: http://www.clanfei.com/2012/04/646.html 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<cmath> 7 #define IN

【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 E - Super Jumping! Jumping! Jumping!

https://vjudge.net/contest/68966#problem/E http://blog.csdn.net/to_be_better/article/details/50563344 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<cmath>

【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 C - Monkey and Banana

https://vjudge.net/contest/68966#problem/C [参考]http://blog.csdn.net/qinmusiyan/article/details/7986263 [题意]:多组测试数据        每组测试数据给出n个砖块的长.宽.高,每种砖块有无穷多个,可以有三种不同的放置方法(xy;xz;yz),下面的砖要比上面的砖的长和宽都大,问最大的高度是多少. [思路]:[贪心+dp]每块砖有三种放置方法,把所有砖的所有状态都压入vector,先贪心,按面

dp1,明天补题解

洛谷1156 垃圾陷阱 #include<bits/stdc++.h> #define inf 1000000007 using namespace std; int d,g,ans; bool f; struct sd{ int t,f,h; bool operator < (const sd q) const{ return t<q.t; }; }s[1009]; int dp[2][109],q[109]; int main(){ scanf("%d%d"

【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 B - Ignatius and the Princess IV

http://www.cnblogs.com/joeylee97/p/6616039.html 引入一个cnt,输入元素与上一个元素相同,cnt增加,否则cnt减少,当cnt为零时记录输入元素,因为所求数字至少出现(N+1)/2次,所以最后记录元素就是所求元素 1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<cmath&g

【算法系列学习】DP和滚动数组 [kuangbin带你飞]专题十二 基础DP1 A - Max Sum Plus Plus

A - Max Sum Plus Plus 1 https://vjudge.net/contest/68966#problem/A 2 3 http://www.cnblogs.com/kuangbin/archive/2011/08/04/2127085.html 4 5 /* 6 状态dp[i][j]有前j个数,组成i组的和的最大值.决策: 7 第j个数,是在第包含在第i组里面,还是自己独立成组. 8 方程 dp[i][j]=Max(dp[i][j-1]+a[j] , max( dp[i-

【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 F - Piggy-Bank 【完全背包问题】

https://vjudge.net/contest/68966#problem/F http://blog.csdn.net/libin56842/article/details/9048173 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<cmath> 7

2089 不要62 数位dp-1

Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众.不吉利的数字为所有含有4或62的号码.例如:62315 73418 88914都属于不吉利号码.但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列.你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多