HDU 3033
来源:互联网 发布:淘宝客和返利网是什么 编辑:程序博客网 时间:2024/05/16 19:24
多重背包的变种
固化的思维难以适应多变的题目
这里递推公式不难想 dp[i][j]=max(dp[i][j],dp[i-1][j-c[i][k]]+v[i][k],dp[i][j-c[i][k]]+v[i][k])
dp[i][j]表示前 i 组每组至少选一个,花费 j 获得的最大价值
现在问题是怎么保证每组至少选一个,每个至多选一次。详见代码注释部分。
#include<stdio.h>#include<iostream>#include<memory.h>using namespace std;int n,money,k,num[11],dp[11][10010];struct product{ int cost,value;}p[11][110];int main(){ int a,b,c,w,v,x; while(scanf("%d%d%d",&n,&money,&k)!=EOF) { memset(dp,-1,sizeof(dp)); memset(num,0,sizeof(num)); for(int i=0;i<n;i++) { scanf("%d%d%d",&a,&b,&c); p[a][num[a]].cost=b,p[a][num[a]].value=c; num[a]++; } dp[0][0]=0; for(int i=1;i<=k;i++) { for(int q=0;q<num[i];q++) { w=p[i][q].cost,v=p[i][q].value; for(int j=money;j>=w;j--)//从高到低确保每个物品至多买一次 { if(dp[i][j-w]!=-1)//确保每组至少买一个 dp[i][j]=max(dp[i][j],dp[i][j-w]+v); if(dp[i-1][j-w]!=-1)//确保每组至少买一个 dp[i][j]=max(dp[i][j],dp[i-1][j-w]+v); } } } int ans=-1; for(int i=0;i<=money;i++) ans=max(ans,dp[k][i]); if(ans!=-1) printf("%d\n",ans); else printf("Impossible\n"); } return 0;}
- HDU 3033
- HDU 3033
- HDU 3033 分组背包
- hdu 3033 DP
- HDU 3033(分组背包)
- HDU 3033 分组背包
- hdu 3033 分组背包
- HDU 3033 分组背包
- HDU 3033 分组背包
- hdu 3033-分组背包
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- Java多线程——3 任务的提交者和执行者Executor
- 设计模式之路--综述
- 基于MFC的ActiveX控件开发
- jxl的api--java解析Excel
- 苍白和无赖的android应用
- HDU 3033
- android自定义view解决textview显示排版的问题
- 高并发高负载的大型网站系统架构
- 应用程序挂起、复原与终止— IOS开发
- Wireshark选择Interface时报错
- 创建工程
- Preparation and Practice
- C#基础总结
- C# DllImport的用法