hdu 2159 背包问题
2012-03-20 13:16
246 查看
典型的背包问题,状态转移方程如下:
res[i][j] 表示用i的忍耐度杀j个怪兽获得的最大经验值。
res[i][j]=max(res[i-weight[k]][j-1]+value[k], res[i][j]);
代码如下:
res[i][j] 表示用i的忍耐度杀j个怪兽获得的最大经验值。
res[i][j]=max(res[i-weight[k]][j-1]+value[k], res[i][j]);
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int weight[101],value[101],res[101][101]; int max(int a,int b) { return a > b ? a : b; } int work(int n,int m,int k,int s) { int i,j,l; for(i=1;i<=m;i++) for(j=1;j<=s;j++) for(l=1;l<=k;l++) if(i>=weight[l]) res[i][j]=max(res[i-weight[l]][j-1]+value[l],res[i][j]); /*for(i=1;i<=m;i++) { for(j=1;j<=s;j++) printf("%d ",res[i][j]); printf("\n"); }*/ if(res[m][s] < n) return -1; for(i=1;i<=m;i++) for(j=1;j<=s;j++) if(res[i][j] >= n) return m-i; return 0; } int main() { int i,k,m,n,s; while(scanf("%d %d %d %d",&n,&m,&k,&s)!=EOF) { memset(res,0,sizeof(res)); for(i=1;i<=k;i++) scanf("%d %d",&value[i],&weight[i]); printf("%d\n",work(n,m,k,s)); } return 0; }
相关文章推荐
- HDU 2159 二维费用背包问题
- HDU 2159 FATE 背包问题
- HDU 2159 FATE 动态规划二维费用的背包问题
- HDU 2159 FATE (动态规划dp之二维完全背包问题)
- hdu 2159 二维费用背包问题
- hdu 2159 FATE(二位费用的多重背包问题)
- hdu 2159 FATE(背包问题)
- HDU_2159_背包问题
- HDU 2159 二维费用背包问题
- HDU-2159 FATE(二维费用背包问题)
- HDU 2159 背包问题+我的理解
- hdu 2159 FATE (二维费用背包问题)
- HDU 1114 Piggy-Bank(完全背包问题)
- B - Big Event in HDU(背包问题01背包)
- hdu 1011 Starship Troopers(树形DP+背包问题)
- hdu 2159 Fate(完全背包 最多取K件)
- hdu 2639Bone Collector II 背包的第K优解问题
- HDU 1561 树形DP背包问题
- 【HDU 1114】Piggy-Bank(dp||完全背包问题)
- hdu 2159(二维完全背包)