题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203
#include <iostream> #include <iomanip> #include <algorithm> using namespace std; /**************************************************************************************************************** 题意:0/1背包问题解决最大花费问题 思路: 1,前i件物品放入容量为v的包中→只考虑第i件放和不放→ 前i-1件物品放入容量为v的包中(不选第i件),前i-1件物品放入容量为v-c[i]的包中(选第i件) 2, f[i][v] =max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 3,本道题注意转换,可能拿到offer的最大几率=拿不到offer的最小几率 ****************************************************************************************************************/ int w[10005]; float dp[10005],v[10005]; int main() { int n,m; while(cin>>n>>m) { if(n == 0 && m == 0) break; for(int i =1;i <= m;i ++){ cin>>w[i]>>v[i]; v[i]=1-v[i]; } for(int i = 0;i <= n;i ++) dp[i]=1; for(int i = 1;i <= m;i ++) for(int j = n;j >= w[i];j --) dp[j]=min((dp[j-w[i]]*v[i]),dp[j]); cout<<setiosflags(ios::fixed)<<setprecision(1)<<(1-dp[n])*100<<"%"<<endl; } return 0; }