题解:

思路:将v1,v2,k都当作一种体积,开三维dp数组,每种物品只能取一次

代码中的for循环是倒着进行的,知道01背包和完全背包的肯定明白,倒着进行的就代表每种物品只选择一次

代码:

 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6 const int maxn=105;
7 const int INF=0x3f3f3f3f;
8 int dp[maxn][maxn][6];
9 struct shudui
10 {
11 int a,b,val;
12 } m[maxn];
13 int main()
14 {
15 int n,v1,v2,k1;
16 while(~scanf("%d%d%d%d",&n,&v1,&v2,&k1))
17 {
18 for(int i=1; i<=n; ++i)
19 {
20 scanf("%d%d%d",&m[i].a,&m[i].b,&m[i].val);
21 }
22 memset(dp,0,sizeof(dp));
23 for(int l=1; l<=n; ++l)
24 {
25 for(int i=v1; i>=0; --i)
26 {
27 for(int j=v2; j>=0; --j)
28 {
29 for(int k=k1; k>=0; --k)
30 {
31 int temp=0;
32 if(i-m[l].a>=0)
33 temp=max(temp,dp[i-m[l].a][j][k]+m[l].val);
34 if(j-m[l].b>=0)
35 temp=max(temp,dp[i][j-m[l].b][k]+m[l].val);
36 if(k>0)
37 temp=max(temp,dp[i][j][k-1]+m[l].val);
38 dp[i][j][k]=max(dp[i][j][k],temp);
39 }
40 }
41 }
42 }
43 printf("%d\n",dp[v1][v2][k1]);
44 }
45 return 0;
46 }

其实感觉多维背包也是一种套路,主要是找到dp的维度

最新文章

  1. 怎么使用jQuery
  2. [No000086]C#foreach集合被改变,报错处理方案
  3. 在windows 下安装启动redis
  4. Nginx系列4之基础配置
  5. struts2 配置 struts.xml 提示
  6. ZOJ 3603 Draw Something Cheat
  7. Growling Gears
  8. poj 3411 Paid Roads
  9. ajax请求获取到数据,但是仍然不能触发success方法
  10. HTML5的localStorage和sessionStorage
  11. Caffe代码分析--crop_layer.cu
  12. Java中引用的浅复制和深复制
  13. asp.net 限制上传文件的大小与时间
  14. Android View框架总结(九)KeyEvent事件分发机制
  15. BZOJ-9-3295: [Cqoi2011]动态逆序对
  16. 将网站项目转为 Web form应用程序(转)
  17. python 用type()创建类
  18. jsp/servlet区别
  19. WPF实现MDI窗体的方法
  20. 回测框架pybacktest简介(一)

热门文章

  1. 剑指offer 面试题10.1:青蛙跳台阶
  2. Java开发手册之异常日志
  3. XSS类型,防御及常见payload构造总结
  4. Empire
  5. Spring Initializr中生成的mvnw是干吗的?
  6. java虚拟机入门(三)- 你了解对象吗
  7. Netty之JAVA BIO模型
  8. Java并发组件二之CyclicBarriar
  9. .net core Wpf中使用cefsharp加载本地html网页,并且cefsharp支持any cpu
  10. LOJ10098