按照這個做的:
hdu 1864 最大報銷額
01揹包
方法一:
double型別的揹包
總數30個、每個最大1000、保留2位有效位。直接把double*100轉換為int型的揹包
**
//看清題目
//double型的01揹包
#include
#include
#include
using namespace std;
const int n = 3000050;
int dp[n];
int a[n];
int main(void)
else if(c == 'b' && b+price <= 600.0)
else if(c == 'c' && c+price <= 600.0)
else
flag = 0;
}if(flag && a+b+c <= 1000.0)
a[cnt++] = (a+b+c)*100;
}int v = (total)*100;
for(i = 0; i < cnt; i++)
}double ans = dp[v];
printf("%.2lf\n", ans/100.0);
}return 0;
}
對個數揹包,dp[j] = max(dp[j], dp[j-1]+a[i]);
網上的**能ac但錯了的**,有後效性
這組就過不了
100.00 5
1 a:5
1 b:20
1 c:24
1 a:30
1 a:60
#include
#include
#include
using namespace std;
const int n = 100;
double a[n];
double dp[n];
void debug(int n, double a)
printf("\n");
}int main(void)
else if(c == 'b' && price+b <= 600.0)
else if(c == 'c' && price+c <= 600.0)
else
flag = 0;
}if(flag && a+b+c <= 1000.0)
}for(i = 0; i < cnt; i++)
}double ans = 0;
for(i = 0; i <= cnt; i++)
ans = max(ans, dp[i]);
printf("%.2lf\n", ans);
}return 0;
}
方法二:
搜尋
//dfs+剪枝
#include
#include
#include
#include
using namespace std;
const int n = 100;
double a[n];
double sum[n];
double dfs(double total, int cnt)
else
ans = dfs(total, cnt-1);
return ans;
}int main(void)
else if(c == 'b' && b+price <= 600.0)
else if(c == 'c' && c+price <= 600.0)
else
flag = 0;
}if(flag && a+b+c <= 1000.0)
a[cnt++] = (a+b+c);
}for(i = 1; i < cnt; i++)
printf("%.2lf\n", dfs(total, cnt-1));
}return 0;
}
Dp基礎 簡單揹包問題
揹包問題大意 給你乙個揹包有一定的容量,再給你一下些物品,物品有自己的體積和價值,請你選擇價值和最大的一些物品 最體積不超過揹包的容量 揹包問題思路 逐漸放每乙個物品,找到當前體積的最大價值。揹包問題的主要 for i 1 i n i 逐漸放乙個物品 for j m j w i j 列舉揹包放下這個...
DP 揹包專題 揹包九講
這段時間看了 揹包九講 在hust vjudge上找到了乙個題單,挑選了其中16道題集中做了下,選題全部是hdu上的題,大多是簡單題。目前做了點小總結,大概提了下每道題的思路重點部分,希望以後回看回想時能有幫助。題單 hdu 1059 hdu 1114 hdu 1171 hdu 1203 hdu 1...
DP經典例題 揹包專題
揹包的基本模型 給你乙個容量為v的揹包和若干種物品,在一定的限制條件下 每種物品都占用一定容量 問最多能放進多少價值的物品?題意 有n個重量和價值分別為wi,vi,從這些物品中挑選總重量不超過w的物品,使其價值最大,輸出價值最大值 其中每個物品最多只能放一件 這題其實用dfs也可以做,但超時 確認子...