1203
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
int main()
{
int money, t;
int mean[10000];
double dp[10000], percent[10000];
while(cin>>money>>t)
{
for(int i = 0; i <= money; ++i)
{
dp[i] = 1;
}
if(money == 0 && t == 0) break;
for(int i = 0; i < t; ++i)
{
cin>>mean[i]>>percent[i];
}
for(int i = 0; i < t; ++i)
{
for(int j = money; j >= mean[i]; --j)
{
dp[j] = min(dp[j], dp[j - mean[i]]*(1-percent[i]));
}
}
double ans = (1 - dp[money]) * 100;
cout<<setiosflags(ios::fixed)<<setprecision(1)<<ans<<"%"<<endl;
}
return 0;
}
参考题目:01背包:注意优化
1003
最大子数段和
#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
int main()
{
int t, num;
cin>>t;
int nums[100000];
int dp[100000];
int p[100000];
int maxt;
int ans;
for(int i = 1; i <= t; ++i)
{
cin>>num;
for(int j = 0; j < num; ++j)
{
cin>>nums[j];
}
dp[0] = nums[0];
p[0] = 0;
for(int j = 1; j < num; ++j)
{
dp[j] = max(nums[j], dp[j - 1] + nums[j]);
if(nums[j]> dp[j - 1] + nums[j])
{
p[j] = j;
dp[j] = nums[j];
}
else
{
dp[j] = nums[j] + dp[j - 1];
p[j] = p[j - 1];
}
}
maxt = -0x3f3f3f3f;
ans = 0;
for(int j = 0; j < num; ++j)
{
if(maxt < dp[j])
{
ans = j;
maxt = dp[j];
}
}
cout<<"Case "<<i<<":"<<endl;
cout<<maxt<<" "<<p[ans] + 1<<" "<<ans + 1<<endl;
if(i < t) cout<<endl;
}
return 0;
}