发现又是一道求max 的0/1分数规划的题目,与普通的0/1分数规划不同的是,这题加了一个限制条件,总重量不低于W,我们只要把重量超过w看成等于w,这题不就是一个0/1背包问题。
对于0/1分数规划问题:(3条消息) 0/1分数规划(poj2976)_Knight840的博客-CSDN博客
对于0/1背包问题:dp[j]表示重量为j的最大权值,由于每个物品只有一个,且dp[j]是由比j小的值确定,如果从小到大遍历j,就会用到这一轮更新过的dp值,可能导致一轮不止用一次第i个物品的值,所以遍历j要从大到小遍历。
#include
using namespace std;
int n,w;
double dp[10000];
struct node
{
int w;
int t;
double y;
}h[1005];
bool check(double m)
{
for(int i=0;i=0;j--)//一定是从大到小遍历
{
if(j+h[i].w>=w)
{
dp[w]=max(dp[w],dp[j]+h[i].y);
}
else dp[j+h[i].w]=max(dp[j+h[i].w],dp[j]+h[i].y);
}
}
if(dp[w]>=0)return 1;
else return 0;
}
int main()
{
cin>>n>>w;
for(int i=0;i>h[i].w>>h[i].t;
}
double l=0,r=0;
for(int i=0;i