这道题系统提示用动规,就用dp了。
我觉得像是完全背包,打表发现:倒着数,当i≠dp[i]的时候,i就是所求值。
以下是正确源码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAX=1000*1000;
int dp[MAX+5];
int a[2];
int main()
{
scanf("%d%d",&a[0],&a[1]);
memset(dp,0,sizeof(dp));
for(int i=0;i<=1;i++)
{
for(int j=a[i];j<=MAX;j++)
{
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
}
/*for(int i=0;i<100;i++)
cout<<"i="<<i<<" dp="<<dp[i]<<endl;
cout<<endl;*/
int i;
for(i=MAX;i>=0;i--)
if(i!=dp[i])
break;
printf("%d",i);
return 0;
}
后来发现是有公式的:https://blog.csdn.net/jingqi814/article/details/21734449
#include <iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
cout << a * b - a - b << endl;
return 0;
}
我的天哪,这也太简单了吧!!!膜拜一下推出来的大佬Orz
2019年3月2日:再回来看了下这道题。dp[v]表示的就是容量为v时价值最大是多少(此题价值重量可以互用),那么v≠dp[v]就代表这个数无法“凑”成。另外循环(v的最大值)可以不从MAX开始,比如a[0]*a[1]也过了。