HDU 1864 最大報銷額 01揹包,爛題

2022-05-16 16:45:46 字數 1713 閱讀 2042

題意:被坑慘,單項不能超過600,其實是一張發票上a類/b類/c類的總和分別不能超過600。

思路:此題的資料很爛。用貪心也能過,用01揹包也可以。都測試不出到底那些是錯的。

1 #include 2 #include 3 #include 

4 #include 5 #include 6 #include 7

using

namespace

std;

8const

int n=31; //

發票張數

9double

money;

10int

num,t;

11int

a,b,c;

12double

tick[n];

1314

int cmp(double a, double

b)15

18void

packet()

192930}

31 printf("

%.2lf\n

",ans);

3233}34

3536

intmain()

3768

if( !flag || cnt>1000 || a>600 || b>600 || c>600)69

continue;70

else

71 tick[t++]=cnt;

7273}74

//以上都是輸入的,重點在這個函式而已

75packet();76}

77return0;

78 }

貪心我覺得貪心應該不能過的,比如有資料:

1001.5 4

1 a:500

1 c:400

1 a:300

1 b:200

貪心的結果是900,而正確答案是1000=500+300+200.。神奇的是ac了。

1 #include 2 #include 3 #include 

4 #include 5 #include 6

using

namespace

std;

7const

int n=31; //

發票張數

8double

money;

9double dp[30005

];10

double

tick[n];

11int

num,t,a,b,c;

1213

void

packet()

1427

}28 printf("

%.2lf\n

",dp[(int

)ceil(money)]); 29}

3031

intmain()

3261

if( !flag || cnt>1000 || a>600 || b>600 || c>600)62

continue;63

else

64 tick[t++]=cnt; 65}

66packet();67}

68return0;

69 }

限額作為揹包容量

這個比上面的精確多了,至少上面的資料能測出正確答案。

hdu 1864最大報銷額 01揹包

當成0 1揹包來做的 思路,先轉化成整數,擴大100倍,首先刪除不符合條件的,然後01揹包 提交情況 memory limit exceed 1次,一開始擴大了1000倍,不過我感覺還是應該擴大1000倍。收穫 printf 0.2lf n double dp int all 100 100 中如果...

hdu 1864 最大報銷額 01揹包

此題 為01揹包,可以把最大金額當做揹包容量,然後把發票的金額當做揹包的容量和價值 則成了簡單的01揹包 我做此題,錯了n次,究其原因我是把p 60000寫成了p 100000 include include include include include using namespace std d...

01揹包 HDU 1864 最大報銷額

轉化為整數擴大100倍處理 為賦值抑制字元,表示本輸入項對應的資料 讀入後,不賦給相應的變數 如 scanf 2d 2d 3d a,b printf d n d n a,b 輸入123456789 則系統將讀取12並賦給a 讀取34但捨掉 讀取567並賦給b 所以a 12 b 567 處理好輸入後,...