dp问题:找出状态方程 dp[j] = min(dp[j], dp[j - c[i]] *( 1 - w[i])); 是0 1 背包为题的一个变形体;注意每循环一次都要对dp[]数组进行初始化。
#include<iostream>
using namespace std;#define Min(a,b) a < b? a:b
int main()
{
freopen("input.txt","r",stdin);
int n, m , i , j;
int c[10010];
double w[10010];
memset(c , 0 , sizeof(c));
memset(w , 0 , sizeof(w));
double dp[10010];
while(true)
{
cin>>n>>m;
fill(dp, dp + 10010,1);
if(n == 0 && m == 0) return 0;
for(i = 0; i < m;i ++)
cin>>c[i]>>w[i];
for(i = 0; i < m ; i ++)
for(j = n; j >= c[i]; j --)
dp[j] =Min(dp[j],dp[j-c[i]] * (1 - w[i]));
printf("%.1lf%%\n", (1- dp[n]) * 100);
}
return 0;
}
3526

被折叠的 条评论
为什么被折叠?



