这是动态规划里的背包类型的最基础的一种题目-01背包,即每件物品只有一件,相信看过的一些01背包的网上解释的都只到,01背包是只要考虑当前的物品是放或不放就可以理解这类题目,但是我个人认为这种的理解太片面了,虽然这样理解很形象,很容易理解01背包问题,但是这样去理解的话就体现不出背包问题的实质——动态规划的思想(这只是本菜鸟的个人理解,不喜勿喷)。
接下来用一个表格给大家解释:
一言不合上代码:
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
#define N 101
int main()
{
int T,n,i,j,v,m[N];
double p[N],P,sp,dp[N*N];
scanf("%d",&T);
while(T--)
{
memset(dp,0,sizeof(dp));
memset(p,0,sizeof(p));
memset(m,0,sizeof(m));
v=0;
scanf("%lf %d",&P,&n);
P=1-P;
for(i=1;i<=n;i++)
{
scanf("%d %lf",&m[i],&sp);
v+=m[i];
p[i]=1-sp;
}
dp[0]=1;
for(i=1;i<=n;i++)
{
for(j=v;j>=m[i];j--)
{
dp[j]=max(dp[j],dp[j-m[i]]*p[i]);
}
}
for(i = v; i >= 0; i--)
{
if(dp[i] >= P)
{
break;
}
}
printf("%d\n",i);
}
return 0;
}