解题
Description
過去的日子里,農夫John的牛沒有任何題目. 可是現在他們有題目,有很多的題目.精確地說,他們有P (1 <= P <= 300) 道題目要做. 他們還離開了農場并且象普通人一樣找到了工作. 他們的月薪是M (1 <= M <= 1000) 元.
他們的題目是一流的難題,所以他們得找幫手.幫手們不是免費的,但是他們能保證在一個月內作出任何題目.每做一道題需要兩比付款, 第一筆A_i(1 <= A_i <= M)元在做題的那一個月初支付, 第二筆B_i元(1 <= B_i <= M)在做完后的下一個月初支付. 每一個月牛們用上一個月掙的錢來付款. 牛沒有任何存款意識, 所以每個月的節余都回拿用去買糖吃掉了.
因為題目是相互關連的,它們必須按大概順序解出. 比如,題目3必須在解題目4之前或同一個月解出. 找出牛們做完所有題目并支付完所有款項的最短月數.
Input
第一行: M 和 P
第2…P+1行: 第i行包含A_i和B_i, 分別是做第i道題的欲先付款和完成付款.
Output
第一行: 牛們做完題目和付完帳目的最少月數
Sample Input
100 5
40 20
60 20
30 50
30 50
40 40
Sample Output
6
Data Constraint
Hint
【樣例說明】
牛們的月薪是100元. 他們有5道題目要做, 預期付款分別為 40, 60, 30, 30,
40, 完成付款分別為 20,本20, 50, 50, 40.
.
.
.
.
.
.
分析
用f[i][j]表示最后一個月做[i,j]內的所有題所需要的總天數
三重for循環轉移,還要判斷一下是否需要隔一個月才能做這些題
.
.
.
.
.
.
程序:
#include<iostream> #include<cstring> using namespace std; int n,p,ans; int a[1010],b[1010],sa[1010],sb[1010]; int f[310][310]; int main() {cin>>n>>p;int i,j,k;for (i=1;i<=p;i++){cin>>a[i]>>b[i];sa[i]=sa[i-1]+a[i];sb[i]=sb[i-1]+b[i];}memset(f,0x3f,sizeof(f));for (i=1;i<=p;i++)if (sa[i]<=n&&sb[i]<=n) f[i][1]=1;ans=2147483646;for (i=1;i<=p;i++){for (j=1;j<=i;j++){for (k=1;k<j;k++){if (sa[i]-sa[j-1]<=n&&sb[i]-sb[j-1]<=n) f[i][j]=min(f[i][j],f[j-1][k]+2);if (sa[i]-sa[j-1]+sb[j-1]-sb[k-1]<=n&&sb[i]-sb[j-1]<=n) f[i][j]=min(f[i][j],f[j-1][k]+1);}if(i==p) ans=min(ans,f[i][j]);}}cout<<ans+2;return 0; }轉載于:https://www.cnblogs.com/YYC-0304/p/9499953.html
總結